145 lines
4.3 KiB
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()
|
|
)
|
|
}
|
|
}
|