jsdw_ios/QuickLocation/Section/Group/MemberInfo/MemberInfoVC.swift

185 lines
7.0 KiB
Swift

//
// 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()
}
}