当前应用保留聊天工作流和左右双面板布局,右侧编辑能力已经统一使用块编辑器。聊天面板不需要感知具体 block 组件,只负责创建或打开文档,并通过 UI store 传递文档 ID。
App
├── ChatPanel
│ ├── MessageList
│ ├── MessageItem
│ └── MessageInput
└── ResizableLayout
└── 右侧视图
├── ExportRecordList
└── EditorPanel
└── EditorWithOutline
├── DocumentOutline
└── BlockEditor
App.tsx 使用 React.lazy 加载面板。右侧视图的选择由 uiStore.previewDocumentId 决定:有文档 ID 时显示编辑器,否则显示导出记录。
聊天消息中的预览操作
-> MessageItem
-> uiStore.openDocumentPreview(documentId, documentName)
-> App 读取 previewDocumentId
-> EditorPanel
-> EditorWithOutline
-> BlockEditor
-> editorStore.loadDocument(documentId)
-> blockService.getBlocks(documentId)
关闭流程:
hasModified 为 true,显示未保存确认框。onClose。App 清除预览状态,右侧返回导出记录列表。聊天面板与编辑器之间只传递稳定的面板参数:
interface EditorPanelProps {
documentId: string;
initialDocumentName?: string | null;
onClose: () => void;
}
聊天组件不应直接操作 editorStore.blocks,编辑器也不应直接读取聊天消息。跨面板状态使用 uiStore,文档内容使用 editorStore,聊天内容使用 chatStore。
| 层 | 负责内容 |
|---|---|
chatStore |
消息、会话、流式 AI 回复 |
documentStore |
文档创建和文档基础操作 |
uiStore |
预览文档、面板偏好和全局 UI 状态 |
editorStore |
blocks、脏块、保存、重试和编辑状态 |
blockService |
blocks API 请求 |
exportService |
后端 Word 导出 |
clientExportService |
浏览器 PDF 和 Markdown 导出 |
EditorPanel 继续保留,不能将 App 直接改为调用内部 block 组件。WYSIWYGEditor、MDXEditor 或 Feature Flag 分支。Editor 子树或 editorStore,避免扩大 ChatPanel 的职责。mammoth 只在 Word 内容解析时加载。npm run serve:prod,不要用开发服务器替代 Lighthouse 目标。协同编辑、版本回滚、搜索替换和权限隔离都需要后端协议支持,不能只在 ChatPanel 或 EditorPanel 中追加临时状态。实施前应先确定文档版本、并发冲突、用户身份和错误恢复策略。