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

145 lines
4.3 KiB
Swift

//
// 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]>
var createSucceeded: Signal<Void>
}
let input: Input
let output: Output
var disposeBag = DisposeBag()
private let sectionedItems = PublishSubject<[GroupTagListSectionModel]>()
private let groupTemplates = PublishSubject<[GroupTemplateModel]>()
private let createSucceeded = PublishRelay<Void>()
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(error)
})
.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: { [weak self] _ in
self?.createSucceeded.accept(())
}, onError: { (error) in
DLToast.show(error)
}).disposed(by: disposeBag)
}
// MARK: - init
init() {
input = Input()
output = Output(
sectionedItems: sectionedItems.asObservable(),
groupTemplates: groupTemplates.asObservable(),
createSucceeded: createSucceeded.asSignal()
)
}
}