You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
10 KiB
243 lines
10 KiB
// |
|
// UserInfoViewController.swift |
|
// HPlusFit |
|
// |
|
// Created by lemo. on 2019/7/16. |
|
// Copyright © 2019 lemo. All rights reserved. |
|
// |
|
|
|
import UIKit |
|
import AVFoundation |
|
|
|
// MARK:- 复用 |
|
fileprivate enum Resuable { |
|
static let tableViewCell = ReusableCell<CommonTableViewCell>(nibName: "CommonTableViewCell") |
|
} |
|
|
|
class UserInfoViewController: TableViewController { |
|
|
|
private let rxDataSource = RxTableViewSectionedReloadDataSource |
|
<SectionModel<String, TableViewCellModel>>(configureCell: { |
|
(dataSource, tv, indexPath, element) in |
|
let cell = tv.dequeue(Resuable.tableViewCell, for: indexPath) |
|
cell.bindViewModel(model: element) |
|
return cell |
|
}) |
|
private lazy var inputAlert: UIAlertController = { |
|
let alertCtr = UIAlertController.init(title: MultiLanguageKey_FB.changeNicknameFB.localized, message: "", preferredStyle: .alert) |
|
let ok = UIAlertAction(title: MultiLanguageKey_FB.confirmFB.localized, style:.destructive) { [weak self] (action:UIAlertAction) in |
|
guard let nickname = alertCtr.textFields?.first?.text, nickname != "" else { |
|
SVProgressHUD.showError(withStatus: MultiLanguageKey_FB.nicknameTipFB.localized) |
|
return |
|
} |
|
guard let `self` = self, var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
userInfo.nickname = nickname |
|
self.refreshUI(userInfo: userInfo) |
|
} |
|
let cancel = UIAlertAction(title: MultiLanguageKey_FB.cancelFB.localized, style:.cancel) |
|
alertCtr.addAction(ok) |
|
alertCtr.addAction(cancel) |
|
alertCtr.addTextField { [weak self] textField in |
|
textField.placeholder = MultiLanguageKey_FB.nicknameTipFB.localized |
|
} |
|
return alertCtr |
|
}() |
|
private lazy var genderAlert: UIAlertController = { |
|
let alertCtr = UIAlertController.init(title: MultiLanguageKey_FB.changeGenderFB.localized, message: "", preferredStyle: .actionSheet) |
|
let maleAction = UIAlertAction(title: MultiLanguageKey_FB.maleFB.localized, style: .default, handler: { [weak self] _ in |
|
guard let `self` = self, var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
userInfo.gender = false |
|
self.refreshUI(userInfo: userInfo) |
|
}) |
|
let femaleAction = UIAlertAction(title: MultiLanguageKey_FB.femaleFB.localized, style: .default, handler: { [weak self] _ in |
|
guard let `self` = self, var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
userInfo.gender = true |
|
self.refreshUI(userInfo: userInfo) |
|
}) |
|
let cancelAction = UIAlertAction(title: MultiLanguageKey_FB.cancelFB.localized, style: .cancel, handler: nil) |
|
alertCtr.addAction(maleAction) |
|
alertCtr.addAction(femaleAction) |
|
alertCtr.addAction(cancelAction) |
|
return alertCtr |
|
}() |
|
private lazy var pickerView: PickerView = { |
|
let pickerView = PickerView() |
|
pickerView.currenValues = { [weak self] (value) in |
|
guard let `self` = self else { return } |
|
guard var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
switch pickerView.type { |
|
case .height: |
|
userInfo.heightCM = value |
|
case .weight: |
|
userInfo.weightKG = value |
|
case .birthday: |
|
let dateStr = DateClass.timestampToStr(value, formatStr: "yyyy-MM-dd") |
|
userInfo.birthday = dateStr |
|
default: |
|
break |
|
} |
|
self.refreshUI(userInfo: userInfo) |
|
} |
|
return pickerView |
|
}() |
|
|
|
override func viewDidLoad() { |
|
super.viewDidLoad() |
|
} |
|
|
|
override func makeUI() { |
|
super.makeUI() |
|
tableView.rx.setDelegate(self).disposed(by: rx.disposeBag) |
|
tableView.register(Resuable.tableViewCell) |
|
tableView.snp.makeConstraints { (make) in |
|
make.edges.equalToSuperview() |
|
} |
|
} |
|
|
|
override func bindViewModel() { |
|
super.bindViewModel() |
|
guard let viewModel = viewModel as? UserInfoViewModel else { return } |
|
viewModel.relay.asObservable() |
|
.bind(to: tableView.rx.items(dataSource: rxDataSource)) |
|
.disposed(by: rx.disposeBag) |
|
tableView.rx.modelSelected(TableViewCellModel.self) |
|
.subscribe(onNext: { [weak self] (cellModel) in |
|
guard let `self` = self else { return } |
|
guard let userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
guard let type = cellModel.userInfoType else { return } |
|
var pickerType: PikcerType = .height |
|
var pickerValue = 0 |
|
switch type { |
|
case .head: |
|
self.setAvator() |
|
return |
|
case .gender: |
|
self.present(self.genderAlert, animated: true, completion: nil) |
|
return |
|
case .nickname: |
|
self.present(self.inputAlert, animated: true, completion: nil) |
|
return |
|
case .height: |
|
pickerType = .height |
|
pickerValue = userInfo.heightCM |
|
case .weight: |
|
pickerType = .weight |
|
pickerValue = userInfo.weightKG |
|
case .birthday: |
|
pickerType = .birthday |
|
pickerValue = userInfo.birthdayValue |
|
} |
|
self.pickerView.show(values: pickerValue, type: pickerType, view: self.view) |
|
}) |
|
.disposed(by: rx.disposeBag) |
|
} |
|
|
|
/// 刷新页面 |
|
/// - Parameter userInfo: 用户信息 |
|
func refreshUI(userInfo: UserInfo) { |
|
// 保存本地 |
|
UserDefaultsManagerFrieBoltt.saveUserInfo(userInfo: userInfo) |
|
// 同步设备 |
|
BluetoothService.shared.sendBleCmdSetUserInfo(user: userInfo) |
|
guard let viewModel = self.viewModel as? UserInfoViewModel else { return } |
|
viewModel.loadFuncationList() |
|
// 发送更新通知 |
|
kNotificationCenter.post(name: NSNotification.Name(UserInfoUpdateFireBoltt), object: nil) |
|
} |
|
|
|
} |
|
|
|
extension UserInfoViewController: UITableViewDelegate { |
|
|
|
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { |
|
if indexPath.row == 0 { |
|
return kScaleHeight(75) |
|
} |
|
return kScaleHeight(55) |
|
} |
|
|
|
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
|
tableView.deselectRow(at: indexPath, animated: true) |
|
} |
|
|
|
} |
|
|
|
extension UserInfoViewController { |
|
func setAvator() { |
|
let alertC = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet) |
|
alertC.addAction(UIAlertAction.init(title: MultiLanguageKey_FB.cancelFB.localized, style: UIAlertAction.Style.cancel, handler: nil)) |
|
let camera = UIAlertAction.init(title: MultiLanguageKey_FB.cameraFB.localized, style: UIAlertAction.Style.default, handler: {[weak self] (_) in |
|
guard let `self` = self else { return } |
|
|
|
let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) |
|
if authStatus == .denied || authStatus == .restricted { |
|
let alertVC = UIAlertController.init(title: MultiLanguageKey_FB.tipFB.localized, message: MultiLanguageKey_FB.carmaPowerFB.localized, preferredStyle: .alert) |
|
let goToAction = UIAlertAction.init(title: MultiLanguageKey_FB.gotoFB.localized, style: .default) { (action) in |
|
if let url = URL(string: UIApplication.openSettingsURLString) { |
|
if UIApplication.shared.canOpenURL(url) { |
|
UIApplication.shared.openURL(url) |
|
} |
|
} |
|
} |
|
let cancelAction = UIAlertAction(title: MultiLanguageKey_FB.cancelFB.localized, style: .cancel, handler: nil) |
|
alertVC.addAction(goToAction) |
|
alertVC.addAction(cancelAction) |
|
self.present(alertVC, animated: true, completion: nil) |
|
return |
|
} |
|
self.cameraAction() |
|
}) |
|
|
|
let gallery = UIAlertAction.init(title: MultiLanguageKey_FB.photoSelectFB.localized, style: UIAlertAction.Style.default, handler: { [weak self](_) in |
|
guard let `self` = self else { return } |
|
self.galleryAction() |
|
}) |
|
alertC.addAction(camera) |
|
alertC.addAction(gallery) |
|
self.present(alertC, animated: true, completion: nil) |
|
} |
|
|
|
func cameraAction() { |
|
UIImagePickerController.rx.createWithParent(self, animated: true) { (picker) in |
|
picker.allowsEditing = true |
|
picker.sourceType = .camera |
|
} |
|
.flatMap { |
|
$0.rx.didFinishPickingMediaWithInfo |
|
} |
|
.take(1) |
|
.map { info in |
|
return info[UIImagePickerController.InfoKey.editedImage.rawValue] as? UIImage |
|
} |
|
.subscribe(onNext: { [weak self](chooseImg) in |
|
guard let `self` = self, let chooseImg = chooseImg, var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
userInfo.avatar = chooseImg.jpegData(compressionQuality: 0.1) |
|
userInfo.avatarImg = chooseImg |
|
self.refreshUI(userInfo: userInfo) |
|
}) |
|
.disposed(by: rx.disposeBag) |
|
} |
|
|
|
func galleryAction() { |
|
UIImagePickerController.rx.createWithParent(self, animated: true) { (picker) in |
|
picker.allowsEditing = true |
|
picker.sourceType = .photoLibrary |
|
} |
|
.flatMap { |
|
$0.rx.didFinishPickingMediaWithInfo |
|
} |
|
.take(1) |
|
.map { info in |
|
return info[UIImagePickerController.InfoKey.editedImage.rawValue] as? UIImage |
|
} |
|
.subscribe(onNext: { [weak self](chooseImg) in |
|
guard let `self` = self, let chooseImg = chooseImg, var userInfo = UserDefaultsManagerFrieBoltt.getUserInfo() else { return } |
|
userInfo.avatar = chooseImg.jpegData(compressionQuality: 0.1) |
|
userInfo.avatarImg = chooseImg |
|
self.refreshUI(userInfo: userInfo) |
|
}) |
|
.disposed(by: rx.disposeBag) |
|
} |
|
|
|
} |
|
|
|
|