// // AppUsageReportVC.swift // QuickLocation // import UIKit import RxSwift import RxCocoa import ObjectMapper final class AppUsageReportVC: BaseViewController { private var rootView: AppUsageReportView! private let viewModel: AppUsageReportViewModel init(members: [GroupMemberModel], selectedUserId: String, groupModel: GroupModel?) { viewModel = AppUsageReportViewModel( members: members, selectedUserId: selectedUserId, groupKey: groupModel?.default_group_key ?? "" ) super.init(nibName: nil, bundle: nil) } convenience init(userInfo: [String: Any]) { let membersJson: [[String: Any]] if let members = userInfo["members"] as? [[String: Any]] { membersJson = members } else if let members = userInfo["members"] as? [Any] { membersJson = members.compactMap { $0 as? [String: Any] } } else { membersJson = [] } let members = membersJson.compactMap { GroupMemberModel(JSON: $0) } let selectedUserId = (userInfo["userId"] as? String) ?? members.first?.user_id ?? "" let groupModel = (userInfo["groupJson"] as? [String: Any]).flatMap { GroupModel(JSON: $0) } self.init(members: members, selectedUserId: selectedUserId, groupModel: groupModel) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { rootView = AppUsageReportView(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.onPeriodChanged = { [weak self] period in self?.viewModel.selectedPeriod.accept(period) } 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] snapshot in self?.rootView.apply(snapshot) }) .disposed(by: disposeBag) } } extension AppUsageReportVC: 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 member = viewModel.members[indexPath.item] cell.configure( model: member, isCurrentUser: member.user_id == AppContextManager.shared.userId, isSelected: member.user_id == viewModel.selectedMemberId.value ) return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { viewModel.selectedMemberId.accept(viewModel.members[indexPath.item].user_id) } }