308 lines
12 KiB
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")
|
|
}
|
|
}
|