jsdw_ios/QuickLocation/Section/Mine/MineViewController.swift

170 lines
5.5 KiB
Swift

//
// 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<MineListSectionModel> = {
RxTableViewSectionedReloadDataSource<MineListSectionModel>(
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)
}
}