From 7d6c60ac42f030536da908c36c765c23c4716182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E9=BE=99?= Date: Thu, 14 Aug 2025 16:35:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/pages/work-flow.tsx | 24 ++-- components/pages/work-flow/media-viewer.tsx | 45 ++++--- .../pages/work-flow/use-workflow-data.tsx | 122 ++++++++++++------ 3 files changed, 123 insertions(+), 68 deletions(-) diff --git a/components/pages/work-flow.tsx b/components/pages/work-flow.tsx index c21d766..e6b06bb 100644 --- a/components/pages/work-flow.tsx +++ b/components/pages/work-flow.tsx @@ -1,5 +1,5 @@ "use client" -import React, { useRef, useEffect } from "react"; +import React, { useRef, useEffect, useCallback } from "react"; import "./style/work-flow.css"; import { Skeleton } from "@/components/ui/skeleton"; import { AISuggestionBar } from "@/components/ai-suggestion-bar"; @@ -16,7 +16,7 @@ import { GlassIconButton } from '@/components/ui/glass-icon-button'; import { SaveEditUseCase } from "@/app/service/usecase/SaveEditUseCase"; import { useSearchParams } from "next/navigation"; -export default function WorkFlow() { +const WorkFlow = React.memo(function WorkFlow() { console.log('WorkFlow--0294877777777777') const containerRef = useRef(null); const [isEditModalOpen, setIsEditModalOpen] = React.useState(false); @@ -85,7 +85,7 @@ export default function WorkFlow() { sketchCount, totalSketchCount }); - }, [isGeneratingSketch, taskSketch.length, sketchCount, totalSketchCount, currentStep, isPlaying]); + }, [currentStep, isGeneratingSketch, isGeneratingVideo, isPlaying, taskSketch.length, sketchCount, totalSketchCount]); // 专门监控isPlaying状态变化 useEffect(() => { @@ -108,18 +108,18 @@ export default function WorkFlow() { "Adjust lens language" ]; - const handleEditModalOpen = (tab: string) => { + const handleEditModalOpen = useCallback((tab: string) => { setActiveEditTab(tab); setIsEditModalOpen(true); - }; + }, []); - const handleSuggestionClick = (suggestion: string) => { + const handleSuggestionClick = useCallback((suggestion: string) => { console.log('Selected suggestion:', suggestion); - }; + }, []); - const handleSubmit = (text: string) => { + const handleSubmit = useCallback((text: string) => { console.log('Submitted text:', text); - }; + }, []); return ( @@ -239,7 +239,7 @@ export default function WorkFlow() { icon={isPauseWorkFlow ? Play : Pause} size='lg' tooltip={isPauseWorkFlow ? "Play" : "Pause"} - onClick={() => setIsPauseWorkFlow(!isPauseWorkFlow)} + onClick={useCallback(() => setIsPauseWorkFlow(!isPauseWorkFlow), [isPauseWorkFlow])} /> { mode !== 'automatic' && ( ) -} +}); + +export default WorkFlow; diff --git a/components/pages/work-flow/media-viewer.tsx b/components/pages/work-flow/media-viewer.tsx index 61b5392..56a370c 100644 --- a/components/pages/work-flow/media-viewer.tsx +++ b/components/pages/work-flow/media-viewer.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useRef, useEffect, useState, SetStateAction } from 'react'; +import React, { useRef, useEffect, useState, SetStateAction, useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Edit3, Play, Pause, Volume2, VolumeX, Maximize, Minimize } from 'lucide-react'; import { ProgressiveReveal, presets } from '@/components/ui/progressive-reveal'; @@ -32,7 +32,7 @@ interface MediaViewerProps { mode: string; } -export function MediaViewer({ +export const MediaViewer = React.memo(function MediaViewer({ scriptData, currentStep, currentSketchIndex, @@ -146,6 +146,29 @@ export function MediaViewer({ } }; + // 使用 useMemo 缓存最终视频元素,避免重复创建和请求 + const memoizedFinalVideoElement = useMemo(() => { + console.log('final', final); + if (!final?.url) return null; + + return ( +