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.
244 lines
10 KiB
244 lines
10 KiB
![]()
2 years ago
|
//
|
||
|
// 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.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)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|