// // MemberInfoVC.swift // QuickLocation // import UIKit import RxSwift import RxCocoa import ObjectMapper import Kingfisher final class MemberInfoVC: BaseViewController { private var rootView: MemberInfoView! private var members: [GroupMemberModel] private var selectedUserId: String private var groupModel: GroupModel? init(members: [GroupMemberModel], selectedUserId: String, groupModel: GroupModel?) { self.members = members self.selectedUserId = selectedUserId self.groupModel = groupModel super.init(nibName: nil, bundle: nil) } convenience init(userInfo: [String: Any]) { let rawMembers = userInfo["members"] let membersJson: [[String: Any]] if let arr = rawMembers as? [[String: Any]] { membersJson = arr } else if let arr = rawMembers as? [Any] { membersJson = arr.compactMap { $0 as? [String: Any] } } else { membersJson = [] } let members = membersJson.compactMap { GroupMemberModel(JSON: $0) } let selected = (userInfo["userId"] as? String) ?? members.first?.user_id ?? "" let group = (userInfo["groupJson"] as? [String: Any]).flatMap { GroupModel(JSON: $0) } self.init(members: members, selectedUserId: selected, groupModel: group) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { rootView = MemberInfoView(frame: UIScreen.main.bounds) view = rootView } override func viewDidLoad() { super.viewDidLoad() rootView.memberCV.dataSource = self rootView.memberCV.delegate = self bind() refreshDetail() rootView.memberCV.reloadData() } private func bind() { rootView.navView.onBackTapped = { [weak self] in self?.navigationController?.popViewController(animated: true) } rootView.switchGroupBtn.rx.tap .subscribe(onNext: { [weak self] in self?.switchGroup() }) .disposed(by: disposeBag) } private func switchGroup() { guard let groupModel else { return } GroupListPopView.show(groupModel: groupModel) { [weak self] groupKey in guard let self, let key = groupKey else { return } GroupService.operate(opType: "setdefault", requestData: ["group_key": key]) .subscribe(onNext: { [weak self] _ in NotificationCenter.default.post(name: .RefreshGroupInfoNotification, object: nil) self?.navigationController?.popViewController(animated: true) }) .disposed(by: self.disposeBag) } } private func refreshDetail() { let member = members.first { $0.user_id == selectedUserId } let isSelf = selectedUserId == AppContextManager.shared.userId let joinText: String = { guard let ts = member?.join_time, ts > 0 else { return "**" } let date = Date(timeIntervalSince1970: TimeInterval(ts) / 1000) let f = DateFormatter() f.dateFormat = "yyyy-MM-dd" return f.string(from: date) }() let circleName: String = { guard let gm = groupModel else { return "共同圈子" } let name = gm.groups.first(where: { $0.group_key == gm.default_group_key })?.name ?? gm.groups.first?.name return (name?.isEmpty == false) ? name! : "共同圈子" }() if isSelf { let sexText: String = { switch AppContextManager.shared.sex { case 1: return "男" case 2: return "女" default: return "未设置" } }() rootView.renderRows([ MemberInfoRow(title: "头像", value: "", kind: .avatar, avatarURL: member?.head_pic) { [weak self] in AppRouter.push(Route.myProfile) _ = self }, MemberInfoRow(title: "昵称", value: member?.nick_name ?? "", kind: .disclosure) { AppRouter.push(Route.myProfile) }, MemberInfoRow(title: "性别", value: sexText, kind: .disclosure) { AppRouter.push(Route.myProfile) }, MemberInfoRow(title: "添加时间", value: joinText, kind: .text), MemberInfoRow(title: "共同圈子", value: circleName, kind: .tag) ]) } else { rootView.renderRows([ MemberInfoRow(title: "昵称", value: member?.nick_name ?? "", kind: .text), MemberInfoRow(title: "备注", value: member?.nick_name ?? "", kind: .disclosure) { DLToast.show(text: "敬请期待") }, MemberInfoRow(title: "关系", value: "未绑定", kind: .disclosure) { DLToast.show(text: "敬请期待") }, MemberInfoRow(title: "性别", value: "保密", kind: .text), MemberInfoRow(title: "添加时间", value: joinText, kind: .text), MemberInfoRow(title: "共同圈子", value: circleName, kind: .tag) ]) } } } extension MemberInfoVC: UICollectionViewDataSource, UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { members.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell: GroupMemberListCell = collectionView.dequeueReusableCell(for: indexPath) let model = members[indexPath.item] cell.configure( model: model, isCurrentUser: model.user_id == AppContextManager.shared.userId, isSelected: model.user_id == selectedUserId ) return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { selectedUserId = members[indexPath.item].user_id collectionView.reloadData() refreshDetail() } }