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