更新 ScriptRenderer 以支持新的数据结构,优化剧本数据处理逻辑并添加调试信息;调整 TaskInfo 中的加载状态逻辑以适应新的剧本加载条件。

This commit is contained in:
北枳 2025-08-07 17:34:22 +08:00
parent 374dd02c0e
commit 884aa5794f
5 changed files with 58 additions and 29 deletions

View File

@ -318,6 +318,7 @@ export const useScriptService = (): UseScriptService => {
const setSynopsisWrapper = useCallback( const setSynopsisWrapper = useCallback(
(value: SetStateAction<string>) => { (value: SetStateAction<string>) => {
const newValue = typeof value === "function" ? value(synopsis) : value; const newValue = typeof value === "function" ? value(synopsis) : value;
console.log('setSynopsisWrapper', newValue);
setSynopsis(newValue); setSynopsis(newValue);
if (scriptEditUseCase) { if (scriptEditUseCase) {
scriptEditUseCase.updateStoryField("synopsis", newValue); scriptEditUseCase.updateStoryField("synopsis", newValue);
@ -487,6 +488,8 @@ export const useScriptService = (): UseScriptService => {
]; ];
// 筛选出有内容的block // 筛选出有内容的block
const filteredArr = arr.filter(item => (item.content.length > 0 && item.content[0].text !== '')); const filteredArr = arr.filter(item => (item.content.length > 0 && item.content[0].text !== ''));
console.log('scriptBlocksMemo 所有关联数据', synopsis, categories, protagonist, incitingIncident, problem, conflict, stakes, characterArc);
console.log('scriptBlocksMemo', filteredArr);
return filteredArr; return filteredArr;
}, [ }, [
synopsis, synopsis,

View File

@ -807,8 +807,8 @@ export function MediaViewer({
return ( return (
<div className="relative w-full h-full bg-white/10 rounded-lg overflow-hidden p-2"> <div className="relative w-full h-full bg-white/10 rounded-lg overflow-hidden p-2">
{ {
mockScriptData ? ( scriptData ? (
<ScriptRenderer data={mockScriptData} setIsPauseWorkFlow={setIsPauseWorkFlow} /> <ScriptRenderer data={scriptData} setIsPauseWorkFlow={setIsPauseWorkFlow} />
) : ( ) : (
<div className="flex gap-2 w-full h-full"> <div className="flex gap-2 w-full h-full">
<div className="w-[70%] h-full rounded-lg gap-2 flex flex-col"> <div className="w-[70%] h-full rounded-lg gap-2 flex flex-col">

View File

@ -205,21 +205,13 @@ export function TaskInfo({
setIsScriptModalOpen(true); setIsScriptModalOpen(true);
setCurrentStage(1); setCurrentStage(1);
} }
// if (currentLoadingText.includes('character')) { if (currentLoadingText.includes('script')) {
// console.log('isScriptModalOpen-character', currentLoadingText, isScriptModalOpen); console.log('isScriptModalOpen-script', currentLoadingText, isScriptModalOpen);
// if (isScriptModalOpen) { if (isScriptModalOpen) {
// setIsScriptModalOpen(false); setIsScriptModalOpen(false);
}
// // 延迟8s 再次打开 setCurrentStage(0);
// timerRef.current = setTimeout(() => { }
// setIsScriptModalOpen(true);
// setCurrentStage(0);
// }, 8000);
// } else {
// setIsScriptModalOpen(true);
// setCurrentStage(0);
// }
// }
if (currentLoadingText.includes('initializing')) { if (currentLoadingText.includes('initializing')) {
console.log('isScriptModalOpen-initializing', currentLoadingText, isScriptModalOpen); console.log('isScriptModalOpen-initializing', currentLoadingText, isScriptModalOpen);
setIsScriptModalOpen(true); setIsScriptModalOpen(true);

View File

@ -19,6 +19,7 @@ const STEP_MAP = {
// 执行loading文字映射 // 执行loading文字映射
const LOADING_TEXT_MAP = { const LOADING_TEXT_MAP = {
initializing: 'initializing...', initializing: 'initializing...',
script: 'Generating script...',
getSketchStatus: 'Getting sketch status...', getSketchStatus: 'Getting sketch status...',
sketch: (count: number, total: number) => `Generating sketch ${count + 1 > total ? total : count + 1}/${total}...`, sketch: (count: number, total: number) => `Generating sketch ${count + 1 > total ? total : count + 1}/${total}...`,
sketchComplete: 'Sketch generation complete', sketchComplete: 'Sketch generation complete',
@ -83,7 +84,6 @@ export function useWorkflowData() {
const { sketchCount, videoCount } = useAppSelector((state) => state.workflow); const { sketchCount, videoCount } = useAppSelector((state) => state.workflow);
const { const {
loading, // 加载状态
scriptBlocksMemo, // 渲染剧本数据 scriptBlocksMemo, // 渲染剧本数据
initializeFromProject, initializeFromProject,
} = useScriptService(); } = useScriptService();
@ -94,10 +94,12 @@ export function useWorkflowData() {
}, [originalText]); }, [originalText]);
// 监听剧本加载完毕 // 监听剧本加载完毕
useEffect(() => { useEffect(() => {
if (!loading) { if (scriptBlocksMemo.length > 0) {
console.log('开始初始化剧本-scriptBlocksMemo', scriptBlocksMemo); console.log('scriptBlocksMemo 更新:', scriptBlocksMemo);
setScriptData(scriptBlocksMemo);
setCurrentLoadingText(LOADING_TEXT_MAP.script);
} }
}, [loading, scriptBlocksMemo]); }, [scriptBlocksMemo]);
// 自动开始播放一轮 // 自动开始播放一轮
const autoPlaySketch = useCallback(() => { const autoPlaySketch = useCallback(() => {

View File

@ -6,9 +6,10 @@ import ContentEditable, { ContentEditableEvent } from 'react-contenteditable';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { SelectDropdown } from '@/components/ui/select-dropdown'; import { SelectDropdown } from '@/components/ui/select-dropdown';
import { TypewriterText } from '@/components/workflow/work-office/common/TypewriterText'; import { TypewriterText } from '@/components/workflow/work-office/common/TypewriterText';
import { useScriptService } from '@/app/service/Interaction/ScriptService';
interface ScriptRendererProps { interface ScriptRendererProps {
data: ScriptData; data: any[];
setIsPauseWorkFlow: (isPause: boolean) => void; setIsPauseWorkFlow: (isPause: boolean) => void;
} }
@ -21,14 +22,25 @@ export const ScriptRenderer: React.FC<ScriptRendererProps> = ({ data, setIsPause
const [addThemeTag, setAddThemeTag] = useState<string[]>([]); const [addThemeTag, setAddThemeTag] = useState<string[]>([]);
const [isInit, setIsInit] = useState(true); const [isInit, setIsInit] = useState(true);
const {
setSynopsis,
setCategories,
setProtagonist,
setIncitingIncident,
setProblem,
setConflict,
setStakes,
setCharacterArc,
} = useScriptService();
useEffect(() => { useEffect(() => {
const themeBlock = data.blocks.find(block => block.id === 'categories'); const themeBlock = data.find(block => block.id === 'categories');
if (themeBlock && themeBlock.content.length > 0) { if (themeBlock && themeBlock.content.length > 0) {
const themeTag = themeBlock.content[0].text.split(',').map(item => item.trim()); const themeTag = themeBlock.content[0].text.split(',').map(item => item.trim());
console.log('themeTag', themeTag); console.log('themeTag', themeTag);
setAddThemeTag(themeTag); setAddThemeTag(themeTag);
} }
}, [data.blocks]); }, [data]);
// 添加聚焦效果 // 添加聚焦效果
useEffect(() => { useEffect(() => {
@ -99,12 +111,30 @@ export const ScriptRenderer: React.FC<ScriptRendererProps> = ({ data, setIsPause
}; };
const handleBlockTextChange = (block: ScriptBlock) => (e: ContentEditableEvent) => { const handleBlockTextChange = (block: ScriptBlock) => (e: ContentEditableEvent) => {
console.log(e.target.value); // console.log(e.target.value);
}; };
const handleBlockTextBlur = (block: ScriptBlock) => (e: ContentEditableEvent) => { const handleBlockTextBlur = (block: ScriptBlock) => (e: ContentEditableEvent) => {
console.log(e.target.value);
setEditBlockId(null); setEditBlockId(null);
if (contentEditableRef.current) {
const text = contentEditableRef.current.innerText;
console.log('contentEditableRef---text', text);
if (block.id === 'synopsis') {
setSynopsis(text);
} else if (block.id === 'protagonist') {
setProtagonist(text);
} else if (block.id === 'incitingIncident') {
setIncitingIncident(text);
} else if (block.id === 'problem') {
setProblem(text);
} else if (block.id === 'conflict') {
setConflict(text);
} else if (block.id === 'stakes') {
setStakes(text);
} else if (block.id === 'characterArc') {
setCharacterArc(text);
}
}
}; };
const handleThemeTagChange = (value: string[]) => { const handleThemeTagChange = (value: string[]) => {
@ -117,7 +147,9 @@ export const ScriptRenderer: React.FC<ScriptRendererProps> = ({ data, setIsPause
}); });
return; return;
} }
setIsPauseWorkFlow(true);
setAddThemeTag(value); setAddThemeTag(value);
setCategories(value);
}; };
const handleEditBlock = (block: ScriptBlock) => { const handleEditBlock = (block: ScriptBlock) => {
@ -248,7 +280,7 @@ export const ScriptRenderer: React.FC<ScriptRendererProps> = ({ data, setIsPause
return ( return (
<div className="flex h-full overflow-hidden pt-2"> <div className="flex h-full overflow-hidden pt-2">
<div className="flex-1 overflow-y-auto pr-4"> <div className="flex-1 overflow-y-auto pr-4">
{data.blocks.map(renderBlock)} {data.map(renderBlock)}
</div> </div>
<div className="flex-shrink-0 flex flex-col overflow-y-auto relative"> <div className="flex-shrink-0 flex flex-col overflow-y-auto relative">
{/* 翻译功能 待开发 */} {/* 翻译功能 待开发 */}
@ -275,9 +307,9 @@ export const ScriptRenderer: React.FC<ScriptRendererProps> = ({ data, setIsPause
<div className="p-2 rounded-lg"> <div className="p-2 rounded-lg">
<h3 className="text-lg font-semibold mb-1 text-blue-500 flex items-center gap-1"> <h3 className="text-lg font-semibold mb-1 text-blue-500 flex items-center gap-1">
<Navigation className="w-4 h-4 transition-colors" /> <Navigation className="w-4 h-4 transition-colors" />
navigation
</h3> </h3>
{data.blocks.map((block) => ( {data.map((block) => (
<motion.div <motion.div
key={block.id} key={block.id}
className={`py-1 px-1 my-1 rounded cursor-pointer transition-all duration-300 text-white/80 className={`py-1 px-1 my-1 rounded cursor-pointer transition-all duration-300 text-white/80