From fc1d285f417de6b074d14dcf6bc52b491bf822ef Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 26 Sep 2026 09:41:02 +0800 Subject: [PATCH] =?UTF-8?q?chore(cover):=20=E6=B8=85=E7=90=86PreviewCountM?= =?UTF-8?q?odal=E6=AE=8B=E7=95=99=E4=BB=A3=E7=A0=81=20+=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=89=B9=E9=87=8Ffinalize=E5=B0=81=E9=9D=A2/=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E9=94=99=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 PreviewCountModal 组件及 GeneratePage 中残留的 import/state/handleCountConfirm/JSX - 删除 smoke.test.tsx 中无意义的 PreviewCountModal import - 修复批量 finalize 时按 taskIds 数组下标取 previewCovers/previewTitles 的bug: batchTasks 顺序不保证与 variantIndex 一致,改为按 batchTasks[i].variantIndex 对齐封面和标题 --- apps/web/src/pages/generate/GeneratePage.tsx | 63 +-------- .../generate/components/PreviewCountModal.tsx | 127 ------------------ .../src/test/pages/generate/smoke.test.tsx | 1 - 3 files changed, 7 insertions(+), 184 deletions(-) delete mode 100644 apps/web/src/pages/generate/components/PreviewCountModal.tsx diff --git a/apps/web/src/pages/generate/GeneratePage.tsx b/apps/web/src/pages/generate/GeneratePage.tsx index 5fd306f9a..cd5ac4adb 100644 --- a/apps/web/src/pages/generate/GeneratePage.tsx +++ b/apps/web/src/pages/generate/GeneratePage.tsx @@ -14,7 +14,6 @@ import VoiceSelectModal from "./components/VoiceSelectModal" import ScriptSelectModal from "./components/ScriptSelectModal" import TtsVoiceModal from "./components/TtsVoiceModal" import GenerateHeader from "./components/GenerateHeader" -import PreviewCountModal from "./components/PreviewCountModal" import GenerateStepsBar from "./components/GenerateStepsBar" import GenerateStepContent from "./components/GenerateStepContent" import GenerateStepActions from "./components/GenerateStepActions" @@ -138,9 +137,6 @@ const GeneratePage: React.FC = () => { } }, [selectedVoice, isBatch, voiceModePerVideo, setVoiceLibraryIds]) - /* ── 数量选择弹窗 ── */ - const [countModalOpen, setCountModalOpen] = useState(false) - /* ── Step5 保存中状态 ── */ const [finishing, setFinishing] = useState(false) @@ -246,39 +242,6 @@ const GeneratePage: React.FC = () => { }, }) - /* ── 数量弹窗确认 ── */ - const handleCountConfirm = useCallback( - (count: number) => { - setPreviewCount(count) - setCountModalOpen(false) - setPreviewTitles((prev) => { - const list = prev || [] - const base = list[0] || titleSettings.title || "" - return Array.from({ length: count }, (_, i) => list[i] ?? (i === 0 ? base : "")) - }) - setVoiceLibraryIds((prev) => { - const list = prev || [] - return Array.from({ length: count }, (_, i) => list[i] ?? selectedVoice ?? "") - }) - setPreviewCovers((prev) => { - const list = prev || [] - return Array.from({ length: count }, (_, i) => list[i] ?? "") - }) - setSelectedVariantIds(Array.from({ length: count }, (_, i) => i)) - setCurrentStep(3) - }, - [ - setPreviewCount, - setPreviewTitles, - setVoiceLibraryIds, - setPreviewCovers, - setSelectedVariantIds, - setCurrentStep, - titleSettings.title, - selectedVoice, - ], - ) - /* ── 对齐批量数组长度到 previewCount(用于进入 Step3 时) ── */ const ensureArraysAligned = useCallback(() => { setPreviewTitles((prev) => { @@ -465,20 +428,16 @@ const GeneratePage: React.FC = () => { try { // 收集需要 finalize 的任务 ID:批量用 batchTasks;单视频优先用 finalVideo.generation_task_id,兜底 currentTaskId const singleTaskId = finalVideo?.generation_task_id || currentTaskId || "" - const taskIds = - batchTasks && batchTasks.length > 0 - ? batchTasks.map((t) => t.taskId).filter(Boolean) - : singleTaskId - ? [singleTaskId] - : [] // 单视频/批量:为每个任务调用 finalize(入库 + 绑定封面 + 自定义标题) - if (isBatch && taskIds.length > 0) { + // 批量时必须按 batchTasks[i].variantIndex 对齐 previewCovers/previewTitles(taskIds 顺序不一定按变体序号) + if (isBatch && batchTasks.length > 0) { await Promise.all( - taskIds.map(async (taskId, idx) => { - const coverUrl = previewCovers[idx] || "" - const title = previewTitles[idx] || titleSettings.title || "" - return finalizeGeneration(taskId, { + batchTasks.map(async (task) => { + const vi = task.variantIndex + const coverUrl = previewCovers[vi] || "" + const title = previewTitles[vi] || titleSettings.title || "" + return finalizeGeneration(task.taskId, { cover_url: coverUrl || undefined, custom_title: title, }) @@ -707,14 +666,6 @@ const GeneratePage: React.FC = () => { - {/* 数量选择弹窗 */} - setCountModalOpen(false)} - /> - {/* 音色克隆弹窗 */} void - onCancel: () => void -} - -const PreviewCountModal: React.FC = ({ - open, - defaultCount = 1, - onConfirm, - onCancel, -}) => { - const [count, setCount] = useState(defaultCount) - const inputRef = useRef(null) - - useEffect(() => { - if (open) { - setCount(defaultCount) - // 弹窗打开后聚焦并选中,方便直接回车=默认1 - setTimeout(() => inputRef.current?.focus(), 50) - } - }, [open, defaultCount]) - - const clamp = (n: number) => Math.max(1, Math.min(MAX_PREVIEW_COUNT, n || 1)) - - const handleConfirm = () => { - onConfirm(clamp(count)) - } - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === "Enter") { - e.preventDefault() - handleConfirm() - } - if (e.key === "Escape") { - onCancel() - } - } - - if (!open) return null - - return ( -
-
e.stopPropagation()}> -

要生成几个视频?

-

- 素材共用,AI 随机剪辑出不同版本,每个视频可独立设置标题、配音和封面 -

- -
- - setCount(clamp(parseInt(e.target.value, 10) || 1))} - onKeyDown={handleKeyDown} - className="xx-count-input" - /> - -
- -
- {[1, 3, 5, 10].map((n) => ( - - ))} -
- -
- - -
-

- 直接按回车 = 生成 1 个 -

-
-
- ) -} - -export default PreviewCountModal diff --git a/apps/web/src/test/pages/generate/smoke.test.tsx b/apps/web/src/test/pages/generate/smoke.test.tsx index 04d830150..5adc30071 100755 --- a/apps/web/src/test/pages/generate/smoke.test.tsx +++ b/apps/web/src/test/pages/generate/smoke.test.tsx @@ -20,7 +20,6 @@ import "@/pages/generate/components/Step4TitleSettings" import "@/pages/generate/components/Step5VoiceSelect" import "@/pages/generate/components/Step3VoiceWithMode" import "@/pages/generate/components/BatchGenerationGrid" -import "@/pages/generate/components/PreviewCountModal" import "@/pages/generate/components/GenerateStepContent" import "@/pages/generate/components/voice/VoiceRecommendSection" import "@/pages/generate/components/voice/VoiceChoiceCard" -- 2.54.0