| 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 |