Files
deerflow-code/frontend-web/src/open-canvas/components/ai-writing/DraftSync.tsx
T

48 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}