// // 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(nibName: "CommonTableViewCell") } class UserInfoViewController: TableViewController { private let rxDataSource = RxTableViewSectionedReloadDataSource >(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.changeNickname.localized, message: "", preferredStyle: .alert) let ok = UIAlertAction(title: MultiLanguageKey.confirm.localized, style:.destructive) { [weak self] (action:UIAlertAction) in guard let nickname = alertCtr.textFields?.first?.text, nickname != "" else { SVProgressHUD.showError(withStatus: MultiLanguageKey.nicknameTip.localized) return } guard let `self` = self, var userInfo = UserDefaultsManager.getUserInfo() else { return } userInfo.nickname = nickname self.refreshUI(userInfo: userInfo) } let cancel = UIAlertAction(title: MultiLanguageKey.cancel.localized, style:.cancel) alertCtr.addAction(ok) alertCtr.addAction(cancel) alertCtr.addTextField { [weak self] textField in textField.placeholder = MultiLanguageKey.nicknameTip.localized } return alertCtr }() private lazy var genderAlert: UIAlertController = { let alertCtr = UIAlertController.init(title: MultiLanguageKey.changeGender.localized, message: "", preferredStyle: .actionSheet) let maleAction = UIAlertAction(title: MultiLanguageKey.male.localized, style: .default, handler: { [weak self] _ in guard let `self` = self, var userInfo = UserDefaultsManager.getUserInfo() else { return } userInfo.gender = false self.refreshUI(userInfo: userInfo) }) let femaleAction = UIAlertAction(title: MultiLanguageKey.female.localized, style: .default, handler: { [weak self] _ in guard let `self` = self, var userInfo = UserDefaultsManager.getUserInfo() else { return } userInfo.gender = true self.refreshUI(userInfo: userInfo) }) let cancelAction = UIAlertAction(title: MultiLanguageKey.cancel.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 = UserDefaultsManager.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 = UserDefaultsManager.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) { // 保存本地 UserDefaultsManager.saveUserInfo(userInfo: userInfo) // 同步设备 BluetoothService.shared.sendBleCmdSetUserInfo(user: userInfo) guard let viewModel = self.viewModel as? UserInfoViewModel else { return } viewModel.loadFuncationList() // 发送更新通知 kNotificationCenter.post(name: NSNotification.Name(UserInfoUpdate), 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.cancel.localized, style: UIAlertAction.Style.cancel, handler: nil)) let camera = UIAlertAction.init(title: MultiLanguageKey.camera.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.tip.localized, message: MultiLanguageKey.carmaPower.localized, preferredStyle: .alert) let goToAction = UIAlertAction.init(title: MultiLanguageKey.goto.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.cancel.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.photoSelect.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 = UserDefaultsManager.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 = UserDefaultsManager.getUserInfo() else { return } userInfo.avatar = chooseImg.jpegData(compressionQuality: 0.1) userInfo.avatarImg = chooseImg self.refreshUI(userInfo: userInfo) }) .disposed(by: rx.disposeBag) } }