diff --git a/apps/web/src/pages/generate/GeneratePage.tsx b/apps/web/src/pages/generate/GeneratePage.tsx index 492f13680..34934478f 100644 --- a/apps/web/src/pages/generate/GeneratePage.tsx +++ b/apps/web/src/pages/generate/GeneratePage.tsx @@ -12,7 +12,10 @@ import React, { useState, useMemo } from "react" import { Modal, message } from "antd" import { useNavigate } from "react-router-dom" +import { useQuery } from "@tanstack/react-query" import type { VoiceClone } from "@/api/voice-clone" +import { getAssetsByKind } from "@/api/assets/assets" +import type { AssetItem } from "@/api/assets/types" import { useCloneProgress } from "@/hooks/useCloneProgress" import CloneModal from "@/components/voice/CloneModal" import GenerateHeader from "./components/GenerateHeader" @@ -81,7 +84,7 @@ const GeneratePage: React.FC = () => { const sourceVideoUrl = useMemo(() => { const firstId = selectedMaterials[0] if (!firstId) return undefined - const asset = videoAssets.find((a) => a.id === firstId) + const asset = videoAssets.find((a: AssetItem) => a.id === firstId) return asset?.file_url }, [selectedMaterials, videoAssets]) diff --git a/apps/web/src/pages/generate/components/PreviewVideoPanel.tsx b/apps/web/src/pages/generate/components/PreviewVideoPanel.tsx index 03d63024e..a5502e9dc 100644 --- a/apps/web/src/pages/generate/components/PreviewVideoPanel.tsx +++ b/apps/web/src/pages/generate/components/PreviewVideoPanel.tsx @@ -16,6 +16,7 @@ import { PlayCircleOutlined, LoadingOutlined } from "@ant-design/icons" import type { PreviewResult, PreviewStatus } from "../hooks/useStep5Preview" import type { TitleSettings } from "../types" import { drawTitleOnCanvas } from "../utils/drawTitleOnCanvas" +import TitlePreviewCanvas from "./title/TitlePreviewCanvas" interface PreviewVideoPanelProps { previewStatus: PreviewStatus @@ -51,7 +52,6 @@ export const PreviewVideoPanel: React.FC = ({ const hasPreview = previewStatus === "ready" && previewResult const isLoading = previewStatus === "pending" || previewStatus === "generating" const isError = previewStatus === "error" - const showTitlePreview = !!titleSettings const videoAspectStyle = { aspectRatio: (videoRatio || "16:9").replace(":", "/") } // video 模式 refs @@ -203,105 +203,97 @@ export const PreviewVideoPanel: React.FC = ({ )} - {/* 非 Step4 模式才显示以下内容 */} - {!showTitlePreview && ( - <> - {/* 空状态:还没生成预览 */} - {previewStatus === "idle" && ( -
- -

暂无预览

-

在第 3 步生成预览后在此查看

-
- )} + {/* 空状态:还没生成预览(非 Step4 模式) */} + {!showTitlePreview && previewStatus === "idle" && ( +
+ +

暂无预览

+

在第 3 步生成预览后在此查看

+
+ )} - {/* 生成中 */} - {isLoading && ( -
-
-
- -

- {previewStatus === "pending" ? "排队中..." : `生成中 ${progress}%`} -

-
-
-
-
-
-
- )} - - {/* 生成失败 */} - {isError && ( -
-
-

预览生成失败

-
-

- {typeof previewError === "string" && previewError ? previewError : "请重试"} + {/* 生成中(非 Step4 模式) */} + {!showTitlePreview && isLoading && ( +

+
+
+ +

+ {previewStatus === "pending" ? "排队中..." : `生成中 ${progress}%`}

-
- )} +
+
+
+
+
+ )} - {/* 预览成功 + Canvas 标题叠加 */} - {hasPreview && ( -
-
-
- {showTitlePreview && ( - - )} -
- )} + {/* 生成失败(非 Step4 模式) */} + {!showTitlePreview && isError && ( +
+
+

预览生成失败

+
+

+ {typeof previewError === "string" && previewError ? previewError : "请重试"} +

+ +
+ )} - {/* 预览信息 */} - {hasPreview && previewResult && ( -
-
- 时长 - - {(typeof previewResult.duration === "number" - ? previewResult.duration - : 0 - ).toFixed(1)}{" "} - 秒 - -
-
- 片段数 - {previewResult.clipCount} 段 -
-
- 比例 - {videoRatio} -
-
+ {/* 预览成功 + Canvas 标题叠加 */} + {hasPreview && ( +
+
+
+ {showTitlePreview && ( + )} - +
+ )} + + {/* 预览信息(非 Step4 模式) */} + {!showTitlePreview && hasPreview && previewResult && ( +
+
+ 时长 + + {(typeof previewResult.duration === "number" ? previewResult.duration : 0).toFixed(1)}{" "} + 秒 + +
+
+ 片段数 + {previewResult.clipCount} 段 +
+
+ 比例 + {videoRatio} +
+
)}
) diff --git a/apps/web/src/pages/generate/components/Step4TitleSettings.tsx b/apps/web/src/pages/generate/components/Step4TitleSettings.tsx index 131548fb1..698dbe5d0 100644 --- a/apps/web/src/pages/generate/components/Step4TitleSettings.tsx +++ b/apps/web/src/pages/generate/components/Step4TitleSettings.tsx @@ -8,7 +8,6 @@ import type { TitleSettings } from "../types" import { useStep4Title } from "../hooks/useStep4Title" import AiTitleGenerator from "./title/AiTitleGenerator" import TitleStylePanel from "./title/TitleStylePanel" -import TitlePreviewCanvas from "./title/TitlePreviewCanvas" interface Step4TitleSettingsProps { titleSettings: TitleSettings