jsdw_ios/QuickLocation/Section/Home/PhoneReportDetail/PhoneReportDetailVC.swift

120 lines
4.3 KiB
Swift

//
// PhoneReportDetailVC.swift
// QuickLocation
//
import UIKit
import RxSwift
import RxCocoa
import ObjectMapper
final class PhoneReportDetailVC: BaseViewController {
private var rootView: PhoneReportDetailView!
private let viewModel: PhoneReportDetailViewModel
private var groupModel: GroupModel?
init(members: [GroupMemberModel], selectedUserId: String, groupModel: GroupModel?) {
self.viewModel = PhoneReportDetailViewModel(members: members, selectedUserId: selectedUserId)
self.groupModel = groupModel
super.init(nibName: nil, bundle: nil)
}
convenience init(userInfo: [String: Any]) {
let rawMembers = userInfo["members"]
let membersJson: [[String: Any]]
if let arr = rawMembers as? [[String: Any]] {
membersJson = arr
} else if let arr = rawMembers as? [Any] {
membersJson = arr.compactMap { $0 as? [String: Any] }
} else {
membersJson = []
}
let members = membersJson.compactMap { GroupMemberModel(JSON: $0) }
let selected = (userInfo["userId"] as? String) ?? members.first?.user_id ?? ""
let group = (userInfo["groupJson"] as? [String: Any]).flatMap { GroupModel(JSON: $0) }
self.init(members: members, selectedUserId: selected, groupModel: group)
}
required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
override func loadView() {
rootView = PhoneReportDetailView(frame: UIScreen.main.bounds)
view = rootView
}
override func viewDidLoad() {
super.viewDidLoad()
rootView.memberCV.dataSource = self
rootView.memberCV.delegate = self
bind()
rootView.memberCV.reloadData()
}
private func bind() {
rootView.navView.onBackTapped = { [weak self] in
self?.navigationController?.popViewController(animated: true)
}
rootView.switchGroupBtn.rx.tap
.subscribe(onNext: { [weak self] in
self?.switchGroup()
})
.disposed(by: disposeBag)
viewModel.selectedMemberId
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] _ in
self?.rootView.memberCV.reloadData()
})
.disposed(by: disposeBag)
viewModel.snapshot
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] snap in
self?.rootView.apply(snap)
})
.disposed(by: disposeBag)
rootView.screenSection.onModeChanged = { [weak self] mode in
self?.viewModel.screenMode.accept(mode)
}
rootView.unlockSection.onModeChanged = { [weak self] mode in
self?.viewModel.unlockMode.accept(mode)
}
}
private func switchGroup() {
guard let groupModel else { return }
GroupListPopView.show(groupModel: groupModel) { [weak self] groupKey in
guard let self, let key = groupKey else { return }
GroupService.operate(opType: "setdefault", requestData: ["group_key": key])
.subscribe(onNext: { [weak self] _ in
NotificationCenter.default.post(name: .RefreshGroupInfoNotification, object: nil)
self?.navigationController?.popViewController(animated: true)
})
.disposed(by: self.disposeBag)
}
}
}
extension PhoneReportDetailVC: UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
viewModel.members.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell: GroupMemberListCell = collectionView.dequeueReusableCell(for: indexPath)
let model = viewModel.members[indexPath.item]
let selected = model.user_id == viewModel.selectedMemberId.value
let isMe = model.user_id == AppContextManager.shared.userId
cell.configure(model: model, isCurrentUser: isMe, isSelected: selected)
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let model = viewModel.members[indexPath.item]
viewModel.selectedMemberId.accept(model.user_id)
}
}