返回 AiToEarn
README.md
根目录 / project / aitoearn-web / src / store / README.md
1 # Store - 全局状态管理
2
3 基于 Zustand 的全局状态管理模块。这里只放跨页面、跨布局或跨业务域真实复用的状态;页面级状态优先下沉到页面或组件局部 `store/`。
4
5 ## 目录结构
6
7 ```text
8 src/store/
9 ├── index.ts # 统一导出
10 ├── account.ts # 社交账户管理
11 ├── user/ # 用户登录态(store 与私有 utils)
12 ├── system.ts # 系统配置
13 ├── settingsModal.ts # 全局设置弹窗状态
14 ├── configManagerDialog.ts # 全局配置管理弹窗状态
15 ├── login-dialog/ # 全局登录弹窗状态
16 ├── platformMetadata/ # 客户端平台元数据、静态图标和场景过滤
17 ├── publishDetailCache.ts # 发布详情缓存
18 ├── douyinPublishSession.ts # 抖音 H5 发布会话缓存
19 ├── thumbnailCache.ts # 视频缩略图缓存
20 ├── draft-box/ # 草稿箱共享业务状态
21 ├── agent/ # AI Agent 任务管理
22 └── plugin/ # 浏览器插件
23 ```
24
25 ## Store 一览
26
27 | 文件/目录 | Hook | 功能 | 持久化 |
28 | ------------------------- | ---------------------------------------- | -------------------------------------------------------- | --------------- |
29 | `account.ts` | `useAccountStore` | 社交账户管理、账户分组、余额不足弹框 | 否 |
30 | `user/` | `useUserStore` | 用户登录态、Credits 余额、语言、侧边栏 | 是 |
31 | `system.ts` | `useSystemStore` | 系统配置、Agent 测试提示、日历视图与日历节日过滤 | 是(IndexedDB) |
32 | `settingsModal.ts` | `useSettingsModalStore` | 全局设置弹窗可见性、默认 Tab 与子 Tab | 否 |
33 | `configManagerDialog.ts` | `useConfigManagerDialogStore` | 全局配置管理弹窗可见性与触发来源 | 否 |
34 | `login-dialog/` | `useLoginDialogStore` | 全局登录弹窗、登录后跳转与邀请码 | 否 |
35 | `platformMetadata/` | `usePlatformMetadataStore` | 客户端平台元数据、静态图标兜底、平台状态与场景过滤 | 否 |
36 | `publishDetailCache.ts` | `usePublishDetailCache` | 发布详情缓存(5 分钟过期) | 是(IndexedDB) |
37 | `douyinPublishSession.ts` | `useDouyinPublishSessionStore` | 抖音 H5 发布会话缓存(10 分钟恢复) | 是(IndexedDB) |
38 | `thumbnailCache.ts` | `useThumbnailCacheStore` | 视频缩略图缓存 | 是 |
39 | `draft-box/` | `usePlanDetailStore` / `usePlanTabStore` | 草稿箱计划、详情、AI 生成配置与媒体列表同步桥 | 部分 IndexedDB |
40 | `agent/` | `useAgentStore` | AI Agent 任务管理(多任务隔离、SSE、工作流) | 否 |
41 | `plugin/` | `usePluginStore` | 浏览器插件(安装检测、账号同步、发布、发布详情弹窗状态) | 否 |
42
43 ## 关键边界
44
45 - 不要恢复任务广场、线下推广、运营工单、钱包会员、推广跳转等闭源 store。
46 - 单页面或单大型组件使用的状态放调用方局部 `store/`,不要提升到 `src/store`。
47 - 多字段联合取值时配合 `useShallow`,避免不必要重渲染。
48 - 持久化优先复用 `createPersistStore`,路径为 `src/utils/storage/createPersistStore.ts`。
49
50 ## 重点 Store 说明
51
52 ### `useUserStore` — 用户登录态
53
54 - 保存当前用户、登录状态、语言、Credits 余额和侧边栏折叠状态。
55 - 开源版保留 Seedance credits 兼容字段,但映射到普通 Credits / 本地 no-op,避免草稿箱 AI 组件断裂。
56
57 ### `usePlatformMetadataStore` — 平台元数据
58
59 - 统一通过客户端请求加载平台数据,并支持按语言重新归一化已有数据。
60 - 提供平台 Map、静态图标兜底、启用平台、发布平台、任务平台等场景过滤能力。
61
62 ### `useDouyinPublishSessionStore` — 抖音 H5 发布会话
63
64 - 用 IndexedDB 缓存 10 分钟发布会话,支持发布详情弹窗关闭后恢复轮询。
65 - 仅保存发布记录 ID、短链、作品链接、状态、错误信息和提交时间戳。
66
67 ### `useSettingsModalStore` — 全局设置弹窗
68
69 - 设置弹窗由 layout Provider 挂载,页面和业务组件通过 `useSettingsModalStore` 打开。
70 - 开源版设置入口只保留 profile / general,不恢复闭源订阅、钱包、API Key、工单等 Tab。
71
72 ### `useConfigManagerDialogStore` — 全局配置管理弹窗
73
74 - 配置管理弹窗由 layout Provider 挂载,侧边栏和全局错误提示通过 store 打开。
75 - Store 只维护弹框开关和触发来源,不承载配置表单数据。
76
77 ## 技术栈
78
79 - 普通 store:`zustand` + `combine` 中间件。
80 - 持久化 store:`createPersistStore`,默认 `localStorage`,第 4 个参数传 `'indexedDB'` 启用 IndexedDB。
81 - 性能优化:使用 `useShallow` 避免不必要的重渲染。
82
82 lines MARKDOWN