98b7600797
对标安卓正式版、对接 app-server(8770)的 SwiftUI 客户端。iOS 无障碍受限、无比价核心,做自成一体:美团 CPS 导购 + 福利(签到/任务/金币)+ 查看(比价记录/省钱战绩)。 功能完整 M0-M5:脚手架、短信登录(JWT+Keychain+401 自动刷新)、首页券 feed 导购、比价记录+省钱战绩、福利、我的(资料/反馈/设置/注销)。 单 target、0 三方依赖、XcodeGen 生成工程;Debug/Release 双 plist 分流 ATS。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
69 lines
2.1 KiB
Swift
69 lines
2.1 KiB
Swift
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 ?? []
|
|
}
|
|
}
|