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

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)
}
}