48 lines
1.7 KiB
TypeScript
48 lines
1.7 KiB
TypeScript
import { useEffect } from 'react';
|
||
|
||
import { useCanvasGraphContext } from '../../contexts/CanvasGraphContext';
|
||
import { useCanvasUIContext } from '../../contexts/CanvasUIContext';
|
||
import type { WritingStatus } from '../../types/ai-writing';
|
||
|
||
interface DraftSyncProps {
|
||
status: WritingStatus;
|
||
markdown: string;
|
||
title: string;
|
||
}
|
||
|
||
/**
|
||
* 把 AI 写作草稿在「稳定态」同步到画布 artifact / 编辑权限。
|
||
*
|
||
* 流式生成中(writing_draft / revising)**不再**逐 chunk 写入 CanvasUIContext,
|
||
* 右侧预览改由 ``AIWritingDraftPanel`` 直接从 ``AIWritingContext`` 读章节并渲染 Markdown,
|
||
* 避免高频 setState 引发更新风暴。
|
||
*/
|
||
export function DraftSync({ status, markdown, title }: DraftSyncProps) {
|
||
const { setArtifact } = useCanvasGraphContext();
|
||
const { setIsDraftEditable } = useCanvasUIContext();
|
||
|
||
const streaming = status === 'writing_draft' || status === 'revising';
|
||
// 注意:reviewing(编辑审核)不算 generating —— 审核时草稿已定稿、内容稳定,
|
||
// 右侧保持编辑器(富文本)视图,不再切回只读 markdown。仅真正在改写正文的
|
||
// writing_draft / revising 才只读。
|
||
const generating =
|
||
status === 'analyzing_sample' ||
|
||
status === 'researching' ||
|
||
status === 'writing_outline' ||
|
||
streaming;
|
||
|
||
useEffect(() => {
|
||
setIsDraftEditable(!generating);
|
||
}, [generating, setIsDraftEditable]);
|
||
|
||
useEffect(() => {
|
||
if (streaming || !markdown) return;
|
||
setArtifact({
|
||
currentIndex: 0,
|
||
contents: [{ index: 0, type: 'text', title: title || '草稿', fullMarkdown: markdown }],
|
||
});
|
||
}, [streaming, markdown, title, setArtifact]);
|
||
|
||
return null;
|
||
}
|