// // MineViewController.swift // QuickLocation // // Created based on Lanhu design: 我的 // import UIKit import RxSwift import RxCocoa import RxDataSources import ObjectMapper final class MineViewController: BaseViewController { override var isNavigationBarHidden: Bool { true } override var preferredStatusBarStyle: UIStatusBarStyle { .default } fileprivate var rootView: MineView! private var tableView: UITableView { rootView.settingsTableView } private let viewModel = MineViewModel() private var groupKey: String = "" private var groupModel: GroupModel? private var photoWallMembers: [GroupMemberModel] = [] override func loadView() { rootView = MineView(frame: UIScreen.main.bounds) view = rootView } override func viewDidLoad() { super.viewDidLoad() bindViewModel() reactiveAction() viewModel.loadMenuData() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) requestUserInfo() requestGroupMembers() } private func bindViewModel() { viewModel.output.sectionedItems .bind(to: tableView.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) tableView.rx.modelSelected(MineMenuItem.self) .subscribe(viewModel.cellAction.inputs) .disposed(by: disposeBag) } private func reactiveAction() { rootView.vipActivateButton.rx.tap .subscribe(onNext: { _ in AppRouter.push(Route.vipRecharge) }) .disposed(by: disposeBag) rootView.photoWall.onTapMember = { [weak self] member in self?.openMemberInfo(selectedUserId: member.user_id) } rootView.onQuickTap = { [weak self] title in self?.viewModel.handleMenu(MineMenuItem(icon: "", title: title)) } } private lazy var dataSource: RxTableViewSectionedReloadDataSource = { RxTableViewSectionedReloadDataSource( configureCell: { (dataSource, tableView, indexPath, model) in let cell: MineMenuCell = tableView.dequeueReusableCell(for: indexPath) cell.configure(model) let isLast = indexPath.row == dataSource[indexPath.section].items.count - 1 cell.showDivider = !isLast return cell }) }() private func requestUserInfo() { UserService.userInfo().subscribe { response in guard let model = response.model else { return } if AppContextManager.shared.saveAccount(model) { self.rootView.setupData(model) } }.disposed(by: disposeBag) } private func requestGroupMembers() { let cached = AppContextManager.shared.defaultGroupKey if !cached.isEmpty { groupKey = cached loadPhotoWallMembers(groupKey: cached) } GroupService.groupInfo().subscribe(onNext: { [weak self] response in guard let self = self, let model = response.model else { return } self.groupModel = model let key = model.default_group_key guard !key.isEmpty else { if self.groupKey.isEmpty { self.reloadPhotoWall(members: [], groupKey: "") } return } if self.groupKey != key { self.groupKey = key self.loadPhotoWallMembers(groupKey: key) } }).disposed(by: disposeBag) } private func loadPhotoWallMembers(groupKey: String) { GroupService.groupUsers(groupKey: groupKey) .subscribe(onNext: { [weak self] response in guard response.isValid(for: groupKey) else { DLToast.showError(text: response.message ?? "获取圈子成员失败") return } self?.reloadPhotoWall( members: response.list, groupKey: groupKey, groupInfo: response.model ) }, onError: { error in DLToast.showError(text: error.localizedDescription) }) .disposed(by: disposeBag) } private func reloadPhotoWall( members: [GroupMemberModel], groupKey: String, groupInfo: GroupInfoModel? = nil ) { let sorted = viewModel.sortedMembers(members, groupKey: groupKey) photoWallMembers = sorted let ownerId = sorted.first { GroupOwnerMatcher.matches(userId: $0.user_id, groupKey: groupKey) }?.user_id ?? "" let currentGroup = groupInfo ?? groupModel?.groups.first { $0.group_key == groupKey } rootView.photoWall.reload( members: sorted, ownerUserId: ownerId, preferUserId: AppContextManager.shared.userId, isCoupleGroup: currentGroup?.isCoupleGroup == true ) } private func openMemberInfo(selectedUserId: String) { let members = photoWallMembers.map { $0.toJSON() } guard !members.isEmpty else { return } var userInfo: [String: Any] = [ "members": members, "userId": selectedUserId, "groupKey": groupKey ] if let group = groupModel { userInfo["groupJson"] = group.toJSON() } AppRouter.push(Route.memberInfo, userInfo: userInfo) } }