This commit is contained in:
海龙 2025-08-14 21:06:46 +08:00
commit 2dd926d0a1
4 changed files with 82 additions and 24 deletions

View File

@ -312,15 +312,17 @@ export class TextToShotAdapter {
public static fromRoleToText(paragraphs: Paragraph[]): string {
let text = '';
paragraphs.forEach(paragraph => {
paragraph.content.forEach(node => {
if (node.type === 'highlightText') {
text += node.attrs.text;
} else if (node.type === 'text') {
text += node.text;
} else if (node.type === 'characterToken') {
text += node.attrs.name;
}
});
if (paragraph?.content) {
paragraph.content.forEach(node => {
if (node.type === 'highlightText') {
text += node.attrs.text;
} else if (node.type === 'text') {
text += node.text;
} else if (node.type === 'characterToken') {
text += node.attrs.name;
}
});
}
});
return text;
}

View File

@ -117,9 +117,6 @@ const [pendingSwitchTabId, setPendingSwitchTabId] = useState<string | null>(null
// 切换前 检查是否更新
const isUpdate = checkUpdate(tabId);
if (isUpdate) {
// setPendingSwitchTabId(tabId); // 记录要切换到的目标tab
// setRemindFallbackText('You must click Apply button to save the current changes.');
// setIsRemindFallbackOpen(true);
return;
}
setActiveTab(tabId);
@ -129,8 +126,12 @@ const [pendingSwitchTabId, setPendingSwitchTabId] = useState<string | null>(null
const handleSave = () => {
console.log('handleSave');
// setIsRemindFallbackOpen(true);
if (activeTab === '1') {
if (activeTab === '0') {
scriptTabContentRef.current.saveBefore();
} else if (activeTab === '1') {
characterTabContentRef.current.saveBefore();
} else if (activeTab === '3') {
handleConfirmGotoFallback();
}
}

View File

@ -13,35 +13,84 @@ export default function MainEditor({ content, onChangeContent }: MainEditorProps
const [renderContent, setRenderContent] = useState<any[]>(content);
useEffect(() => {
onChangeContent?.(renderContent);;
onChangeContent?.(renderContent);
}, [renderContent]);
const editor = useEditor({
extensions: [
StarterKit,
StarterKit.configure({
paragraph: {
HTMLAttributes: {
class: 'paragraph'
}
},
}),
HighlightTextExtension,
],
content: { type: 'doc', content: renderContent },
content: {
type: 'doc',
content: renderContent.length === 0 ? [{ type: 'paragraph', content: [] }] : renderContent
},
editorProps: {
attributes: {
class: 'prose prose-invert max-w-none focus:outline-none'
},
handleDOMEvents: {
keydown: (view, event) => {
// 如果内容为空且按下删除键或退格键,阻止默认行为
if (
(event.key === 'Backspace' || event.key === 'Delete') &&
editor?.isEmpty
) {
event.preventDefault();
return true;
}
return false;
}
}
},
immediatelyRender: false,
onCreate: ({ editor }) => {
editor.setOptions({ editable: true })
editor.setOptions({ editable: true });
},
onUpdate: ({ editor }) => {
const json = editor.getJSON();
flushSync(() => {
setRenderContent(json.content);
});
try {
const json = editor.getJSON();
// 确保至少有一个空段落
const safeContent = json.content.length === 0
? [{ type: 'paragraph', content: [] }]
: json.content;
flushSync(() => {
setRenderContent(safeContent);
});
} catch (error) {
console.error('Editor update error:', error);
}
},
immediatelyRender: false, // 解决 SSR 水合问题
});
// 监听编辑器内容变化,确保始终有一个段落
useEffect(() => {
const handleEmpty = () => {
if (editor?.isEmpty) {
editor.commands.setContent([{
type: 'paragraph',
content: []
}]);
}
};
editor?.on('update', handleEmpty);
return () => {
editor?.off('update', handleEmpty);
};
}, [editor]);
if (!editor) {
return null
return null;
}
return (
<EditorContent editor={editor} />
);

View File

@ -15,7 +15,7 @@ interface ScriptTabContentProps {
}
export const ScriptTabContent = forwardRef<
{ switchBefore: (tabId: string) => boolean },
{ switchBefore: (tabId: string) => boolean, saveBefore: () => void },
ScriptTabContentProps
>((props, ref) => {
const { setIsPauseWorkFlow, isPauseWorkFlow, originalText, onApply, setActiveTab } = props;
@ -39,6 +39,12 @@ export const ScriptTabContent = forwardRef<
}
return isUpdate;
},
saveBefore: () => {
console.log('saveBefore');
if (isUpdate) {
onApply();
}
}
}));
const handleApply = () => {