forked from 77media/video-flow
更新 ScriptRenderer 以支持新的数据结构,优化剧本数据处理逻辑并添加调试信息;调整 TaskInfo 中的加载状态逻辑以适应新的剧本加载条件。
This commit is contained in:
parent
374dd02c0e
commit
884aa5794f
@ -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,
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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(() => {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user