jsdw_ios/QuickLocation/Section/Group/CreateGroup/CreateGroupViewModel.swift

153 lines
4.8 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// CreateGroupViewModel.swift
// QuickLocation
//
// Created by on 2026/6/3.
//
import RxSwift
import RxCocoa
import RxDataSources
import SwiftyUserDefaults
typealias GroupTagListSectionModel = SectionModel<String, String>
class CreateGroupViewModel {
enum AddTagResult {
case success
case empty
case duplicate
}
static let addTagToken = "__add_tag__"
static let tagMaxLength = 10
struct Input {
}
struct Output {
var sectionedItems: Observable<[GroupTagListSectionModel]>
var groupTemplates: Observable<[GroupTemplateModel]>
}
let input: Input
let output: Output
var disposeBag = DisposeBag()
private let sectionedItems = PublishSubject<[GroupTagListSectionModel]>()
private let groupTemplates = PublishSubject<[GroupTemplateModel]>()
private var tagList = ["私密", "游戏", "运动", "美食",
"自驾", "聚会", "旅行", "学习"]
var selectedTagList: [String] = [] {
didSet {
loadData()
}
}
var groupType = 0
let groupName = BehaviorRelay<String>(value: "")
let groupDesc = BehaviorRelay<String>(value: "")
// MARK: - Cell
lazy var cellAction: Action<String, Void> = { this in
return Action { tag in
if let idx = this.selectedTagList.firstIndex(of: tag) {
this.selectedTagList.remove(at: idx)
} else {
this.selectedTagList.append(tag)
}
return .empty()
}
}(self)
/// tag
func isSelected(tag: String) -> Bool {
return selectedTagList.first(where: { tag == $0 }) != nil
}
func addCustomTag(_ raw: String) -> AddTagResult {
let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmed.isEmpty else { return .empty }
let tag = String(trimmed.prefix(Self.tagMaxLength))
if tagList.contains(tag) {
return .duplicate
}
tagList.append(tag)
selectedTagList.append(tag)
return .success
}
// MARK: -
func loadData() {
sectionedItems.onNext(tagList.mapSection())
}
func requestGroupTemplates() {
GroupService.groupTemplates()
.subscribe(onNext: { [weak self] response in
guard response.code == "0", !response.list.isEmpty else {
DLToast.showError(text: response.message ?? "获取圈子类型失败")
return
}
self?.groupType = response.list[0].type
self?.groupTemplates.onNext(response.list)
}, onError: { error in
DLToast.showError(text: error.localizedDescription)
})
.disposed(by: disposeBag)
}
// MARK: - Request
func requestCreateGroup() {
let name = groupName.value.trimmingCharacters(in: .whitespacesAndNewlines)
guard !name.isEmpty else {
DLToast.show(text: "请输入圈子名称")
return
}
let desc = groupDesc.value.trimmingCharacters(in: .whitespacesAndNewlines)
guard !desc.isEmpty else {
DLToast.show(text: "请输入圈子描述")
return
}
guard groupType > 0 else {
DLToast.showError(text: "圈子类型尚未加载")
return
}
DLToast.showLoading()
GroupService.operate(opType: "create",
requestData: ["group_name": name,
"group_type": groupType,
"description": desc,
"labels": selectedTagList]).subscribe(onNext: { response in
DLToast.showSuccess(text: "创建成功") {
NotificationCenter.default.post(name: .RefreshIMGroupListNotification, object: nil)
AppRouter.shared.popOrDismiss()
}
}, onError: { (error) in
guard let code = error.underlyingError?.code else { return }
guard let systemConfig = AppContextManager.shared.systemConfig, systemConfig.isIntercept == false else { return }
if code == 20009 { // ""
CreateGroupVipPopView.show()
}
else {
DLToast.show(text: error.localizedDescription)
}
}).disposed(by: disposeBag)
}
// MARK: - init
init() {
input = Input()
output = Output(
sectionedItems: sectionedItems.asObservable(),
groupTemplates: groupTemplates.asObservable()
)
}
}