import SwiftUI /// 福利页主数据:金币余额 + 签到状态 + 任务列表,以及签到/领取操作。 @MainActor @Observable final class WelfareViewModel { private(set) var account: CoinAccountDTO? private(set) var signin: SigninStatusDTO? private(set) var tasks: [TaskDTO] = [] private(set) var isLoading = false private(set) var loaded = false private(set) var signinInProgress = false private(set) var toast: String? private let welfare = WelfareService() private let wallet = WalletService() func loadAll() async { guard !isLoading else { return } isLoading = true defer { isLoading = false; loaded = true } await refresh() } func doSignin() async { guard signin?.canClaim == true, !signinInProgress else { return } signinInProgress = true defer { signinInProgress = false } do { let result = try await welfare.doSignin() toast = "签到成功,+\(result.coinAwarded) 金币" await refresh() } catch { toast = (error as? LocalizedError)?.errorDescription ?? "签到失败" } } func claimTask(_ key: String) async { do { let result = try await welfare.claimTask(taskKey: key) toast = "领取成功,+\(result.coinAwarded) 金币" await refresh() } catch { toast = (error as? LocalizedError)?.errorDescription ?? "领取失败" } } func clearToast() { toast = nil } /// 登出时清空,避免换用户后残留上一用户的金币/签到/任务数据。 func reset() { account = nil signin = nil tasks = [] loaded = false toast = nil } /// 三接口并发拉,各自容错。 private func refresh() async { async let accountTask = wallet.account() async let signinTask = welfare.signinStatus() async let tasksTask = welfare.tasks() account = try? await accountTask signin = try? await signinTask tasks = (try? await tasksTask)?.items ?? [] } }