- 新增 ZXAnimations.swift — ZXButtonStyle/ZXPressModifier/ZXPageTransition/ZXThinkingOverlay/ZXCelebrationView/ZXAIAnalysisProgress
- 新增 ZXLoadingView.swift — 品牌化加载动画/ZXDotLoader/ZXShimmer
- 新增 ZXRefreshableScrollView.swift — 下拉刷新+上拉加载更多
- 新增 ZXToast.swift — 全局 Toast 通知系统
- 新增 FileCache.swift / LocalCache.swift — 本地缓存层
- 新增 AIChatViewModel.swift / StudyHomeViewModel.swift / ReviewPlanViewModel.swift
- 全部关键按钮接入 .zxPressable() 触觉反馈
- AI 分析流程接入 ZXThinkingOverlay + ZXAIAnalysisProgress
- 学习完成/复习完成接入 ZXCelebrationView 庆祝动画
- 全部关键交互元素添加 .accessibilityLabel
- 修复 ProfileViewModel async let 问题、EditProfilePage 保存失败、let _ = Task{} 反模式
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
27 lines
1.2 KiB
Swift
27 lines
1.2 KiB
Swift
import Combine
|
|
import Foundation
|
|
|
|
@MainActor
|
|
final class StudyHomeViewModel: ObservableObject {
|
|
@Published var tasks: [ZXSTask] = [
|
|
ZXSTask(t: "机器学习 - 回忆测试", tp: "回忆测试", c: .zxPurple, m: 10, d: true),
|
|
ZXSTask(t: "高数 - 间隔复习 8 题", tp: "间隔复习", c: .zxOrange, m: 15, d: true),
|
|
ZXSTask(t: "英语词汇 - 25 个待复习", tp: "词汇复习", c: .zxTeal, m: 8, d: false),
|
|
ZXSTask(t: "注意力机制 - 费曼解释", tp: "费曼练习", c: .zxAccent, m: 12, d: false),
|
|
ZXSTask(t: "产品设计 - 薄弱点复习", tp: "薄弱点", c: .zxYellow, m: 10, d: false),
|
|
]
|
|
|
|
@Published var weekActivity: [CGFloat] = [0.3, 0.7, 1.0, 0.4, 0.9, 0.6, 0.2]
|
|
let dayLabels = ["一", "二", "三", "四", "五", "六", "日"]
|
|
|
|
var doneCount: Int { tasks.filter(\.d).count }
|
|
var progress: Double { tasks.isEmpty ? 0 : Double(doneCount) / Double(tasks.count) }
|
|
var doneMinutes: Int { tasks.filter(\.d).map(\.m).reduce(0, +) }
|
|
var remainingMinutes: Int { tasks.filter { !$0.d }.map(\.m).reduce(0, +) }
|
|
|
|
func toggleTask(_ task: ZXSTask) {
|
|
guard let idx = tasks.firstIndex(where: { $0.id == task.id }) else { return }
|
|
tasks[idx].d.toggle()
|
|
}
|
|
}
|