jsdw_ios/QuickLocation/Section/Group/GroupSetting/GroupSettingVC.swift

308 lines
12 KiB
Swift

//
// GroupSettingVC.swift
// QuickLocation
//
// Created by on 2026/6/9.
//
import UIKit
import RxSwift
import RxCocoa
import RxDataSources
import ObjectMapper
import OpenIMSDK
class GroupSettingVC: BaseViewController {
fileprivate var rootView: GroupSettingView!
override func loadView() {
rootView = GroupSettingView(frame: UIScreen.main.bounds)
view = rootView
}
private var viewModel: GroupSettingViewModel
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
reactiveAction()
requestGroupInfo()
}
// MARK: - Actions
private func reactiveAction() {
//
rootView.groupNameView.rx.tapGesture.subscribe { _ in
guard let model = self.viewModel.groupModel, model.is_owner else { return }
let vc = TextInputViewController(title: "圈子名称", maxLength: 10, initialText: model.name) { text in
self.requestEditName(text)
}
self.present(vc, animated: true, completion: nil)
}.disposed(by: disposeBag)
//
rootView.groupDescView.rx.tapGesture.subscribe { _ in
guard let model = self.viewModel.groupModel, model.is_owner else { return }
let vc = TextInputViewController(title: "圈子描述", maxLength: 40, initialText: model.description) { text in
self.requestEditDesc(text)
}
self.present(vc, animated: true, completion: nil)
}.disposed(by: disposeBag)
//
rootView.switchBtn.rx.isOn
.skip(1)
.subscribe(onNext: { isOn in
guard let model = self.viewModel.groupModel, model.is_owner else { return }
self.requestChangeReview(isOn)
})
.disposed(by: disposeBag)
//
rootView.tagView.rx.tapGesture.subscribe(onNext: { _ in
guard let model = self.viewModel.groupModel, model.is_owner else { return }
GroupTagListView.show(selectedTagList: model.labels) { tagList in
guard let model = self.viewModel.groupModel,
model.is_owner,
let list = tagList else { return }
self.requestEditLabels(labels: list)
}
}).disposed(by: disposeBag)
rootView.memberHeaderView.rx.tapGesture.subscribe(onNext: { [weak self] _ in
self?.showMemberList()
}).disposed(by: disposeBag)
rootView.onMembersTapped = { [weak self] in
self?.showMemberList()
}
// InviteJoin
rootView.inviteCodeButton.rx.tap.subscribe(onNext: { _ in
guard let model = self.viewModel.groupModel else { return }
AppRouter.push(Route.inviteJoin, userInfo: ["groupInfo": model.toJSON()])
}).disposed(by: disposeBag)
rootView.shareButton.rx.tap.subscribe(onNext: { [weak self] _ in
self?.shareGroup()
}).disposed(by: disposeBag)
//
rootView.auditMemberView.rx.tapGesture.subscribe(onNext: { _ in
guard let model = self.viewModel.groupModel else { return }
AppRouter.push(Route.reviewMemberList, userInfo: ["groupId": model.group_key])
}).disposed(by: disposeBag)
//
rootView.onRemoveMemberShortcutTapped = { [weak self] in
self?.showRemoveMember()
}
rootView.groupNicknameView.rx.tapGesture.subscribe(onNext: { [weak self] _ in
self?.editGroupNickname()
}).disposed(by: disposeBag)
rootView.clearHistoryView.rx.tapGesture.subscribe(onNext: { [weak self] _ in
self?.confirmClearHistory()
}).disposed(by: disposeBag)
//
rootView.dismissGroupView.rx.tapGesture.subscribe(onNext: { _ in
VerificationPopView.show {
self.requestDismissGroup()
}
}).disposed(by: disposeBag)
// 退
rootView.leaveGroupView.rx.tapGesture.subscribe(onNext: { _ in
self.showConfirmPop(title: "确定要离开这个圈子吗?",
message: "您将无法再与此圈子成员分享位置。确定要离开吗?",
confirmText: "",
confirmBlock: { },
cancelText: "") {
self.requestLeaveGroup()
}
}).disposed(by: disposeBag)
}
// MARK: - API
private func requestGroupInfo() {
DLToast.showLoading()
GroupService.groupUsers(groupKey: viewModel.groupId)
.subscribe(onNext: { [weak self] response in
guard let self = self else { return }
DLToast.dismiss()
guard response.isValid(for: self.viewModel.groupId),
let model = response.model else {
DLToast.showError(text: response.message ?? "获取圈子信息失败")
return
}
self.viewModel.groupModel = model
self.viewModel.members = response.list
self.rootView.setupData(model,
members: response.list,
groupNickname: self.viewModel.displayGroupNickname)
self.requestGroupNickname()
}, onError: { error in
DLToast.dismiss()
DLToast.showError(text: error.localizedDescription)
})
.disposed(by: disposeBag)
}
private func requestChangeReview(_ review: Bool) {
DLToast.showLoading()
GroupService.changeReview(requestData: ["group_key": viewModel.groupId, "review": review]).subscribe { response in
DLToast.dismiss()
self.requestGroupInfo()
}.disposed(by: disposeBag)
}
private func requestEditName(_ name: String) {
DLToast.showLoading()
GroupService.editName(requestData: ["group_key": viewModel.groupId, "group_name": name]).subscribe { response in
DLToast.dismiss()
self.requestGroupInfo()
}.disposed(by: disposeBag)
}
private func requestEditDesc(_ desc: String) {
DLToast.showLoading()
GroupService.editDesc(requestData: ["group_key": viewModel.groupId, "description": desc]).subscribe { response in
DLToast.dismiss()
self.requestGroupInfo()
}.disposed(by: disposeBag)
}
private func requestEditLabels(labels: [String]) {
DLToast.showLoading()
GroupService.editLabels(requestData: ["group_key": viewModel.groupId, "labels": labels]).subscribe { response in
DLToast.dismiss()
self.requestGroupInfo()
}.disposed(by: disposeBag)
}
private func requestLeaveGroup() {
dl.showLoading()
GroupService.leave(requestData: ["group_key": viewModel.groupId]).subscribe { response in
self.dl.dismiss()
self.dl.show(text: "成功退出") {
AppRouter.shared.popToRoot()
}
}.disposed(by: disposeBag)
}
private func requestDismissGroup() {
dl.showLoading()
GroupService.dismiss(requestData: ["group_key": viewModel.groupId]).subscribe { response in
self.dl.dismiss()
self.dl.show(text: "成功解散") {
AppRouter.shared.popToRoot()
}
}.disposed(by: disposeBag)
}
// MARK: - Page actions
private func showMemberList() {
guard let model = viewModel.groupModel else { return }
AppRouter.push(Route.groupMemberList, userInfo: ["groupKey": model.group_key])
}
private func showRemoveMember() {
guard let model = viewModel.groupModel, model.is_owner else { return }
AppRouter.push(Route.reviewMemberList, userInfo: ["groupId": model.group_key])
}
private func shareGroup() {
SharePopView.show()
}
private func confirmClearHistory() {
showConfirmPop(title: "清空聊天记录",
message: "清空后无法恢复,确定清空当前圈子的聊天记录吗?",
confirmText: "清空",
confirmBlock: { [weak self] in
self?.clearHistory()
},
cancelText: "取消")
}
private func clearHistory() {
let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId
OIMManager.manager.clearConversationAndDeleteAllMsg("sg_\(groupId)", onSuccess: { _ in
DispatchQueue.main.async {
DLToast.show(text: "聊天记录已清空")
}
}, onFailure: { _, message in
DispatchQueue.main.async {
DLToast.showError(text: message ?? "清空聊天记录失败")
}
})
}
private func requestGroupNickname() {
let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId
let userId = AppContextManager.shared.userId
guard !groupId.isEmpty, !userId.isEmpty else { return }
OIMManager.manager.getSpecifiedGroupMembersInfo(groupId, usersID: [userId], onSuccess: { [weak self] members in
guard let self = self else { return }
let nickname = members?.first?.nickname?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
DispatchQueue.main.async {
self.viewModel.groupNickname = nickname
self.rootView.updateGroupNickname(self.viewModel.displayGroupNickname)
}
}, onFailure: { _, _ in
// The account nickname remains the visible fallback when OpenIM data is unavailable.
})
}
private func editGroupNickname() {
let vc = TextInputViewController(title: "我在本群昵称",
maxLength: 20,
initialText: viewModel.displayGroupNickname) { [weak self] nickname in
self?.updateGroupNickname(nickname)
}
present(vc, animated: true)
}
private func updateGroupNickname(_ nickname: String) {
let trimmedNickname = nickname.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmedNickname.isEmpty else { return }
let groupId = viewModel.groupModel?.group_key ?? viewModel.groupId
let userId = AppContextManager.shared.userId
guard !groupId.isEmpty, !userId.isEmpty else {
DLToast.showError(text: "修改群昵称失败")
return
}
OIMManager.manager.setGroupMemberNickname(groupId,
userID: userId,
groupNickname: trimmedNickname,
onSuccess: { [weak self] _ in
DispatchQueue.main.async {
guard let self = self else { return }
self.viewModel.groupNickname = trimmedNickname
self.rootView.updateGroupNickname(trimmedNickname)
DLToast.show(text: "修改成功")
}
}, onFailure: { _, message in
DispatchQueue.main.async {
DLToast.showError(text: message ?? "修改群昵称失败")
}
})
}
// MARK: - Init
init(groupId: String) {
self.viewModel = GroupSettingViewModel(groupId: groupId)
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}