// // MemberInfoVC.swift // QuickLocation // import UIKit import ObjectMapper 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) } } private func refreshDetail() { let member = members.first { $0.user_id == selectedUserId } let isSelf = selectedUserId == AppContextManager.shared.userId let joinText: String = { guard let date = member?.joinDate else { return "**" } let f = DateFormatter() f.dateFormat = "yyyy-MM-dd" return f.string(from: date) }() let commonGroupsRow = makeCommonGroupsRow(member: member) 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), commonGroupsRow ]) } else { rootView.renderRows([ MemberInfoRow(title: "昵称", value: member?.nick_name ?? "", kind: .text), MemberInfoRow(title: "备注", value: member?.remark ?? "", kind: .disclosure) { DLToast.show(text: "敬请期待") }, MemberInfoRow(title: "关系", value: "未绑定", kind: .disclosure) { DLToast.show(text: "敬请期待") }, MemberInfoRow(title: "性别", value: "保密", kind: .text), MemberInfoRow(title: "添加时间", value: joinText, kind: .text), commonGroupsRow ]) } } private func makeCommonGroupsRow(member: GroupMemberModel?) -> MemberInfoRow { let groups = resolvedCommonGroups(for: member) let firstName = groups.first?.group_name.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" let visibleName = firstName.isEmpty ? "--" : firstName let showsMore = groups.count > 1 let action: (() -> Void)? = showsMore ? { [weak self] in self?.showCommonGroups(groups) } : nil return MemberInfoRow( title: "共同圈子", value: visibleName, kind: .tag, showsMoreTags: showsMore, action: action ) } private func resolvedCommonGroups(for member: GroupMemberModel?) -> [CommonGroupModel] { var groups = CommonGroupModel.deduplicated(member?.common_groups ?? []) let groupInfos = groupModel?.groups ?? [] for index in groups.indices where groups[index].group_name.isEmpty { groups[index].group_name = groupInfos.first { $0.group_key == groups[index].group_key }?.name ?? "未知圈子" } let currentGroup = groupInfos.first { $0.group_key == groupModel?.default_group_key } ?? groupInfos.first if let currentGroup, !currentGroup.group_key.isEmpty { if let index = groups.firstIndex(where: { $0.group_key == currentGroup.group_key }) { var group = groups.remove(at: index) if group.group_name.isEmpty || group.group_name == "未知圈子" { group.group_name = currentGroup.name } groups.insert(group, at: 0) } else { groups.insert( CommonGroupModel(groupKey: currentGroup.group_key, groupName: currentGroup.name), at: 0 ) } } return CommonGroupModel.deduplicated(groups) } private func showCommonGroups(_ groups: [CommonGroupModel]) { guard groups.count > 1 else { return } let popup = CommonGroupsPopVC(groups: groups, groupInfos: groupModel?.groups ?? []) present(popup, animated: true) } } 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() } }