返回 AiToEarn
system.ts
根目录 / project / aitoearn-web / src / store / system.ts
1 import lodash from 'lodash'
2 import { createPersistStore } from '@/utils/storage/createPersistStore'
3
4 /** 日历视图类型 */
5 export type CalendarViewType = 'month' | 'week'
6
7 export interface ISystemStore {
8 /** 是否永久禁用余额不足提示 */
9 disableLowBalanceAlert: boolean
10 /** 是否永久禁用版本更新主动提醒 */
11 disableAppReleaseModalAlert: boolean
12 /** 日历视图类型(PC端) */
13 calendarViewType: CalendarViewType
14 /** 月视图是否显示公历节日 */
15 calendarShowSolarFestivals: boolean
16 /** 月视图是否显示二十四节气 */
17 calendarShowSolarTerms: boolean
18 /** 是否已关闭 Seedance 公告横幅 */
19 dismissSeedanceBanner: boolean
20 /** 我的任务当前选中的 Tab */
21 myTasksTab: 'accepted' | 'published'
22 /** GitHub Stars 缓存值 */
23 githubStars: string
24 /** GitHub Stars 缓存时间戳 */
25 githubStarsUpdatedAt: number
26 /** 移动端导航区域是否展开 */
27 mobileNavExpanded: boolean
28 /** 是否已关闭 Shopify 引导横幅 */
29 dismissShopifyGuideBanner: boolean
30 /** 是否不再显示 Agent 测试阶段提示 */
31 disableAgentTestingNotice: boolean
32 }
33
34 const state: ISystemStore = {
35 disableLowBalanceAlert: false,
36 disableAppReleaseModalAlert: false,
37 calendarViewType: 'week',
38 calendarShowSolarFestivals: true,
39 calendarShowSolarTerms: true,
40 dismissSeedanceBanner: false,
41 myTasksTab: 'accepted',
42 githubStars: '11.5k',
43 githubStarsUpdatedAt: 0,
44 mobileNavExpanded: false,
45 dismissShopifyGuideBanner: false,
46 disableAgentTestingNotice: false,
47 }
48
49 function getState(): ISystemStore {
50 return lodash.cloneDeep(state)
51 }
52
53 export const useSystemStore = createPersistStore(
54 {
55 ...getState(),
56 },
57 (set, _get) => {
58 const methods = {
59 /**
60 * 设置是否永久禁用余额不足提示
61 */
62 setDisableLowBalanceAlert(disabled: boolean) {
63 set({ disableLowBalanceAlert: disabled })
64 },
65 /**
66 * 设置是否永久禁用版本更新主动提醒
67 */
68 setDisableAppReleaseModalAlert(disabled: boolean) {
69 set({ disableAppReleaseModalAlert: disabled })
70 },
71 /**
72 * 设置日历视图类型
73 */
74 setCalendarViewType(viewType: CalendarViewType) {
75 set({ calendarViewType: viewType })
76 },
77 /**
78 * 设置月视图是否显示公历节日
79 */
80 setCalendarShowSolarFestivals(show: boolean) {
81 set({ calendarShowSolarFestivals: show })
82 },
83 /**
84 * 设置月视图是否显示二十四节气
85 */
86 setCalendarShowSolarTerms(show: boolean) {
87 set({ calendarShowSolarTerms: show })
88 },
89 /**
90 * 设置是否已关闭 Seedance 公告横幅
91 */
92 setDismissSeedanceBanner(dismissed: boolean) {
93 set({ dismissSeedanceBanner: dismissed })
94 },
95 /**
96 * 设置我的任务当前选中的 Tab
97 */
98 setMyTasksTab(tab: 'accepted' | 'published') {
99 set({ myTasksTab: tab })
100 },
101 setGitHubStars(stars: string) {
102 set({ githubStars: stars, githubStarsUpdatedAt: Date.now() })
103 },
104 setMobileNavExpanded(expanded: boolean) {
105 set({ mobileNavExpanded: expanded })
106 },
107 setDismissShopifyGuideBanner(dismissed: boolean) {
108 set({ dismissShopifyGuideBanner: dismissed })
109 },
110 setDisableAgentTestingNotice(disabled: boolean) {
111 set({ disableAgentTestingNotice: disabled })
112 },
113 }
114
115 return methods
116 },
117 {
118 name: 'System',
119 version: 12,
120 migrate(persistedState: any, version: number) {
121 // v0→v1: 无需处理(已废弃的 batchAspectRatio 迁移)
122 // v1→v2: 无需处理(已废弃的 batchImageSize 迁移)
123 // v2→v3: batch* 字段已迁移到 DraftBoxConfigStore,清理旧字段
124 if (version < 3) {
125 delete persistedState.batchAspectRatio
126 delete persistedState.batchDuration
127 delete persistedState.batchQuantity
128 delete persistedState.batchModelType
129 delete persistedState.batchContentType
130 delete persistedState.batchImageModel
131 delete persistedState.batchImageCount
132 delete persistedState.batchImageSize
133 }
134 // v3→v4: 重置 dismissSeedanceBanner 以显示新的视频模型促销 banner
135 if (version < 4) {
136 persistedState.dismissSeedanceBanner = false
137 }
138 if (version < 5) {
139 delete persistedState.createTaskDescExpanded
140 }
141 // v5→v6: 重置 dismissSeedanceBanner 以显示新的 gpt image 2 公告 banner
142 if (version < 6) {
143 persistedState.dismissSeedanceBanner = false
144 }
145 // v6→v7: 重置 dismissSeedanceBanner 以显示新的 gpt image 2 限时免费公告 banner
146 if (version < 7) {
147 persistedState.dismissSeedanceBanner = false
148 }
149 // v8→v9: 重置 dismissSeedanceBanner 以显示新的 gpt-image-2 价格公告 banner
150 if (version < 9) {
151 persistedState.dismissSeedanceBanner = false
152 }
153 // v9→v10: 新增版本更新主动提醒禁用状态
154 if (version < 10) {
155 persistedState.disableAppReleaseModalAlert = false
156 }
157 // v10→v11: 重置 dismissSeedanceBanner,确保关闭过的用户可以重新看到当前公告
158 if (version < 11) {
159 persistedState.dismissSeedanceBanner = false
160 }
161 if (version < 12) {
162 persistedState.disableAgentTestingNotice = false
163 }
164
165 const persistedKeys = Object.keys(persistedState)
166 const currentKeys = new Set([...Object.keys(state), 'lastUpdateTime', '_hasHydrated'])
167 persistedKeys.forEach((persistedKey) => {
168 if (!currentKeys.has(persistedKey)) {
169 delete persistedState[persistedKey]
170 }
171 })
172
173 return persistedState
174 },
175 },
176 'indexedDB',
177 )
178
178 lines TYPESCRIPT