将会话、权限、位置、收款与排队存储拆分为独立模块,同步更新各 ViewModel 与单元测试,并补充素材管理 UI 与个人空间设置交互。 Co-authored-by: Cursor <cursoragent@cursor.com>
71 lines
1.9 KiB
Swift
71 lines
1.9 KiB
Swift
//
|
|
// TaskOrderSelectViewModel.swift
|
|
// suixinkan
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// 任务关联订单选择 ViewModel,对齐 Android `OrderSelectViewModel`。
|
|
final class TaskOrderSelectViewModel {
|
|
|
|
private(set) var orders: [AvailableOrder] = []
|
|
private(set) var selectedOrderNumber: String?
|
|
private(set) var isLoading = false
|
|
|
|
var onStateChange: (() -> Void)?
|
|
var onShowMessage: ((String) -> Void)?
|
|
|
|
private let appStore: AppStore
|
|
|
|
init(appStore: AppStore = .shared, initialOrderNumber: String? = nil) {
|
|
self.appStore = appStore
|
|
let trimmed = initialOrderNumber?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
|
selectedOrderNumber = trimmed.isEmpty ? nil : trimmed
|
|
}
|
|
|
|
/// 拉取可选订单列表。
|
|
func loadOrders(api: TaskAPI) async {
|
|
isLoading = true
|
|
notifyStateChange()
|
|
defer {
|
|
isLoading = false
|
|
notifyStateChange()
|
|
}
|
|
|
|
let scenicId = appStore.session.currentScenicId
|
|
guard scenicId > 0 else {
|
|
orders = []
|
|
onShowMessage?("请先选择景区")
|
|
return
|
|
}
|
|
|
|
do {
|
|
orders = try await api.availableOrders(scenicId: scenicId)
|
|
} catch is CancellationError {
|
|
return
|
|
} catch {
|
|
orders = []
|
|
onShowMessage?(error.localizedDescription)
|
|
}
|
|
}
|
|
|
|
/// 切换订单选中状态,再次点击同一项则取消。
|
|
func toggleSelection(orderNumber: String) {
|
|
if selectedOrderNumber == orderNumber {
|
|
selectedOrderNumber = nil
|
|
} else {
|
|
selectedOrderNumber = orderNumber
|
|
}
|
|
notifyStateChange()
|
|
}
|
|
|
|
/// 确认选择并返回订单号。
|
|
func confirmedOrderNumber() -> String? {
|
|
selectedOrderNumber
|
|
}
|
|
|
|
private func notifyStateChange() {
|
|
onStateChange?()
|
|
}
|
|
}
|