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