// // 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() { GroupService.groupInfo().subscribe(onNext: { [weak self] response in guard let self = self, let model = response.model else { return } self.groupModel = model self.groupKey = model.default_group_key guard !model.default_group_key.isEmpty else { self.reloadPhotoWall(members: [], groupKey: "") return } GroupService.groupUsers(groupKey: model.default_group_key) .subscribe(onNext: { [weak self] response in guard response.isValid(for: model.default_group_key) else { DLToast.showError(text: response.message ?? "获取圈子成员失败") return } self?.reloadPhotoWall(members: response.list, groupKey: model.default_group_key) }, onError: { error in DLToast.showError(text: error.localizedDescription) }) .disposed(by: self.disposeBag) }).disposed(by: disposeBag) } private func reloadPhotoWall(members: [GroupMemberModel], groupKey: String) { let sorted = viewModel.sortedMembers(members, groupKey: groupKey) photoWallMembers = sorted let ownerId = sorted.first { GroupOwnerMatcher.matches(userId: $0.user_id, groupKey: groupKey) }?.user_id ?? "" let limit = groupModel?.groups.first { $0.group_key == groupKey }?.group_template?.limit ?? -1 rootView.photoWall.reload( members: sorted, ownerUserId: ownerId, preferUserId: AppContextManager.shared.userId, memberLimit: limit ) } private func openMemberInfo(selectedUserId: String) { let members = photoWallMembers.map { $0.toJSON() } guard !members.isEmpty else { return } var userInfo: [String: Any] = [ "members": members, "userId": selectedUserId ] if let group = groupModel { userInfo["groupJson"] = group.toJSON() } AppRouter.push(Route.memberInfo, userInfo: userInfo) } }