- 所有 SF Symbol .fill 图标替换为线性版本 - 自定义加载动画全部替换为原生 ProgressView/refreshable - StudyHomeView 重设计:优先级驱动主行动卡片 - ZLibraryCard 重新设计:封面图自适应、信息布局优化 - LibraryDetailPage:顶部KB信息区、···菜单、排序、长按操作 - 知识点列表:文件类型图标、学习时长、分割线样式 - 弥散渐变顶部背景 - 新增 icon-folder、icon-xmark SVG Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
62 lines
2.1 KiB
Swift
62 lines
2.1 KiB
Swift
import Combine
|
|
import Foundation
|
|
|
|
@MainActor
|
|
class ActivityViewModel: ObservableObject {
|
|
@Published var summary: ActivitySummary?
|
|
@Published var focusItems: [FocusItem] = []
|
|
@Published var heatmap: [String: Int] = [:]
|
|
@Published var streak: ActivityStreak?
|
|
@Published var trends: [ActivityTrend] = []
|
|
@Published var recommendations: [ActivityRecommendation] = []
|
|
@Published var isLoading = false
|
|
@Published var errorMessage: String?
|
|
|
|
func loadAll() async {
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
async let s = try? ActivityService.shared.summary()
|
|
async let f = try? FocusItemService.shared.list()
|
|
async let h = try? ActivityService.shared.heatmap()
|
|
async let st = try? ActivityService.shared.streak()
|
|
async let t = try? ActivityService.shared.trend()
|
|
async let r = try? ActivityService.shared.recommendations()
|
|
|
|
let (summaryResult, focusResult, heatmapResult, streakResult, trendResult, recResult) = await (s, f, h, st, t, r)
|
|
|
|
summary = summaryResult
|
|
focusItems = focusResult ?? []
|
|
heatmap = heatmapResult ?? [:]
|
|
streak = streakResult
|
|
trends = trendResult ?? []
|
|
recommendations = recResult ?? []
|
|
|
|
if summary == nil {
|
|
errorMessage = "加载分析数据失败,请下拉刷新重试"
|
|
}
|
|
|
|
isLoading = false
|
|
}
|
|
|
|
func refresh() async {
|
|
errorMessage = nil
|
|
|
|
async let s = try? ActivityService.shared.summary()
|
|
async let f = try? FocusItemService.shared.list()
|
|
async let h = try? ActivityService.shared.heatmap()
|
|
async let st = try? ActivityService.shared.streak()
|
|
async let t = try? ActivityService.shared.trend()
|
|
async let r = try? ActivityService.shared.recommendations()
|
|
|
|
let (summaryResult, focusResult, heatmapResult, streakResult, trendResult, recResult) = await (s, f, h, st, t, r)
|
|
|
|
summary = summaryResult
|
|
focusItems = focusResult ?? []
|
|
heatmap = heatmapResult ?? [:]
|
|
streak = streakResult
|
|
trends = trendResult ?? []
|
|
recommendations = recResult ?? []
|
|
}
|
|
}
|