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