jsdw_ios/QuickLocation/Section/Mine/MineViewController.swift

148 lines
5.0 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() {
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)
}
}