From ec150bb46a6390dccadf15b54e23ee59fd5706f0 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 14:13:10 +0800 Subject: [PATCH] refactor: split GenerateResultPanel into sub-components Extract progress indicator and video card into separate components. Main file reduces from 187 to 99 lines (-47%). - ProgressIndicator: circular progress with SVG animation - ResultVideoCard: video thumbnail with download/share actions --- .../components/GenerateResultPanel.tsx | 113 ++---------------- .../result-panel/ProgressIndicator.tsx | 40 +++++++ .../result-panel/ResultVideoCard.tsx | 63 ++++++++++ 3 files changed, 114 insertions(+), 102 deletions(-) mode change 100644 => 100755 apps/web/src/pages/generate/components/GenerateResultPanel.tsx create mode 100755 apps/web/src/pages/generate/components/result-panel/ProgressIndicator.tsx create mode 100755 apps/web/src/pages/generate/components/result-panel/ResultVideoCard.tsx diff --git a/apps/web/src/pages/generate/components/GenerateResultPanel.tsx b/apps/web/src/pages/generate/components/GenerateResultPanel.tsx old mode 100644 new mode 100755 index bae3110d8..f79d9105f --- a/apps/web/src/pages/generate/components/GenerateResultPanel.tsx +++ b/apps/web/src/pages/generate/components/GenerateResultPanel.tsx @@ -1,37 +1,21 @@ -/** - * 智能剪辑右侧生成结果面板 - */ import React from "react" import { Typography } from "antd" -import { - PlayCircleOutlined, - CloseCircleOutlined, - DownloadOutlined, - ShareAltOutlined, -} from "@ant-design/icons" +import { PlayCircleOutlined, CloseCircleOutlined } from "@ant-design/icons" import type { GeneratedVideo } from "@/api/template-editor" -import { formatDuration } from "@/api/voice-clone" +import { ProgressIndicator } from "./result-panel/ProgressIndicator" +import { ResultVideoCard } from "./result-panel/ResultVideoCard" const { Text } = Typography interface GenerateResultPanelProps { - /** 是否已生成完成 */ generated: boolean - /** 是否正在生成中 */ generating: boolean - /** 生成进度(0-100) */ progress: number - /** 生成错误信息 */ generateError: string | null - /** 生成的视频列表 */ generatedVideos: GeneratedVideo[] - /** 点击视频卡片预览回调 */ onVideoPreview: (video: GeneratedVideo) => void - /** 下载回调 */ onDownload: () => void - /** 分享回调 */ onShare: () => void - /** 前往成片库回调 */ onGoToLibrary: () => void } @@ -55,45 +39,8 @@ const GenerateResultPanel: React.FC = ({ )} - {/* 生成中进度 */} - {generating && ( -
-
- - - - - {Math.round(progress)}% -
-
- - 正在生成视频 - - - AI 正在处理素材,请稍候… - -
-
- )} + {generating && } - {/* 生成失败 */} {generateError && !generating && (
@@ -106,7 +53,6 @@ const GenerateResultPanel: React.FC = ({
)} - {/* 空状态 */} {!generated && !generating && !generateError && (
= ({
)} - {/* 生成结果卡片列表 */} {generated && generatedVideos.length > 0 && (
{generatedVideos.map((video, idx) => ( -
onVideoPreview(video)} - > -
- {video.thumbnail_url ? ( - - ) : ( -
- -
- )} -
- -
- {video.duration && ( - {formatDuration(video.duration)} - )} -
-
-
视频 {idx + 1}
-
- - -
-
-
+ video={video} + index={idx} + onPreview={onVideoPreview} + onDownload={onDownload} + onShare={onShare} + /> ))}
)} diff --git a/apps/web/src/pages/generate/components/result-panel/ProgressIndicator.tsx b/apps/web/src/pages/generate/components/result-panel/ProgressIndicator.tsx new file mode 100755 index 000000000..6dc1850b7 --- /dev/null +++ b/apps/web/src/pages/generate/components/result-panel/ProgressIndicator.tsx @@ -0,0 +1,40 @@ +import React from "react" +import { Typography } from "antd" + +const { Text } = Typography + +interface ProgressIndicatorProps { + progress: number +} + +export const ProgressIndicator: React.FC = ({ progress }) => { + return ( +
+
+ + + + + {Math.round(progress)}% +
+
+ + 正在生成视频 + + + AI 正在处理素材,请稍候… + +
+
+ ) +} diff --git a/apps/web/src/pages/generate/components/result-panel/ResultVideoCard.tsx b/apps/web/src/pages/generate/components/result-panel/ResultVideoCard.tsx new file mode 100755 index 000000000..5f73e6058 --- /dev/null +++ b/apps/web/src/pages/generate/components/result-panel/ResultVideoCard.tsx @@ -0,0 +1,63 @@ +import React from "react" +import { PlayCircleOutlined, DownloadOutlined, ShareAltOutlined } from "@ant-design/icons" +import type { GeneratedVideo } from "@/api/template-editor" +import { formatDuration } from "@/api/voice-clone" + +interface ResultVideoCardProps { + video: GeneratedVideo + index: number + onPreview: (video: GeneratedVideo) => void + onDownload: () => void + onShare: () => void +} + +export const ResultVideoCard: React.FC = ({ + video, + index, + onPreview, + onDownload, + onShare, +}) => { + return ( +
onPreview(video)}> +
+ {video.thumbnail_url ? ( + + ) : ( +
+ +
+ )} +
+ +
+ {video.duration && ( + {formatDuration(video.duration)} + )} +
+
+
视频 {index + 1}
+
+ + +
+
+
+ ) +} -- 2.54.0