From ee704efc0bc2649479c5cf2a96f9c9637585caba Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:59:30 +0800 Subject: [PATCH 1/6] =?UTF-8?q?refactor(generate):=20=E6=8F=90=E5=8F=96=20?= =?UTF-8?q?buildPayload=20=E5=92=8C=20validateGenerateInputs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hooks/generate-video/buildPayload.ts | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts diff --git a/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts b/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts new file mode 100644 index 000000000..f4db27a8c --- /dev/null +++ b/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts @@ -0,0 +1,77 @@ +import type { UseGenerateVideoProps } from "./types" +import { buildVoiceConfig } from "./voiceConfig" + +/** + * 构建 updateEditPlan 的 payload + * 从 props 中提取需要的字段,组装成 API 所需的 config 结构 + */ +export const buildEditPlanPayload = (props: UseGenerateVideoProps) => { + const { + titleSettings, + selectedMaterials, + materialMode, + smartSelectedIds, + voiceMode, + selectedVoice, + selectedClonedVoice, + coverSettings, + videoRatio, + style, + duration, + autoSubtitles, + bgm, + generateCount, + } = props + + const voiceConfig = buildVoiceConfig({ + voiceMode, + selectedVoice, + selectedClonedVoice, + }) + + return { + name: titleSettings.title.trim(), + config: { + asset_ids: materialMode === "auto" ? smartSelectedIds : selectedMaterials, + title_config: { + ai_auto_select: titleSettings.aiAutoSelect, + content: titleSettings.title, + position: titleSettings.position, + font_preset: titleSettings.font, + font_color: titleSettings.color, + font_size: titleSettings.size, + }, + cover_config: coverSettings, + ...voiceConfig, + ratio: videoRatio, + style, + duration, + auto_subtitles: autoSubtitles, + bgm, + generate_count: generateCount, + material_mode: materialMode, + }, + total_duration: duration, + status: "editing" as const, + } +} + +/** + * 生成前置校验 + * 返回错误信息,通过则返回 null + */ +export const validateGenerateInputs = (props: UseGenerateVideoProps): string | null => { + const { titleSettings, materialMode, selectedMaterials, voiceMode, selectedClonedVoice } = props + + if (!titleSettings.title.trim()) { + return "请先选择或输入标题" + } + if (materialMode === "manual" && selectedMaterials.length === 0) { + return "请至少选择一个素材" + } + if (voiceMode === "clone" && !selectedClonedVoice) { + return "请先选择一个克隆音色" + } + return null +} + -- 2.54.0 From aef01b50917ee829017b80da67e0abbf634c95ff Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 21:59:53 +0800 Subject: [PATCH 2/6] =?UTF-8?q?refactor(generate):=20=E7=AE=80=E5=8C=96=20?= =?UTF-8?q?useGenerateVideo=EF=BC=8C=E6=8A=BD=E5=8F=96payload=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E5=92=8C=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/generate/hooks/useGenerateVideo.ts | 86 ++----------------- 1 file changed, 9 insertions(+), 77 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts index 1507d6e30..1abe14a44 100644 --- a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts @@ -9,27 +9,11 @@ import { generateEditPlan, updateEditPlan, getEditPlan } from "@/api/template-ed import type { UseGenerateVideoProps } from "./generate-video/types" import { getGenerationPhase } from "./generate-video/phase" import { useGenerationPolling } from "./generate-video/useGenerationPolling" -import { buildVoiceConfig } from "./generate-video/voiceConfig" +import { buildEditPlanPayload, validateGenerateInputs } from "./generate-video/buildPayload" import { extractBackendError, translateError } from "./generate-video/errorUtils" export function useGenerateVideo(props: UseGenerateVideoProps) { - const { - titleSettings, - selectedTemplate, - selectedMaterials, - materialMode, - smartSelectedIds, - voiceMode, - selectedVoice, - selectedClonedVoice, - coverSettings, - videoRatio, - style, - duration, - autoSubtitles, - bgm, - generateCount, - } = props + const { selectedTemplate } = props /* ── 生成状态 ── */ const [generating, setGenerating] = useState(false) @@ -58,16 +42,9 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { /* ── 生成视频 ── */ const generate = useCallback(async () => { - if (!titleSettings.title.trim()) { - message.warning("请先选择或输入标题") - return - } - if (materialMode === "manual" && selectedMaterials.length === 0) { - message.warning("请至少选择一个素材") - return - } - if (voiceMode === "clone" && !selectedClonedVoice) { - message.warning("请先选择一个克隆音色") + const errorMsg = validateGenerateInputs(props) + if (errorMsg) { + message.warning(errorMsg) return } @@ -78,41 +55,13 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { clearTimer() try { - const voiceConfig = buildVoiceConfig({ - voiceMode, - selectedVoice, - selectedClonedVoice, - }) + const payload = buildEditPlanPayload(props) // 获取或创建草稿 await getEditPlan(selectedTemplate) // 更新草稿内容 + 切换到 editing 状态 - await updateEditPlan(selectedTemplate, { - name: titleSettings.title.trim(), - config: { - asset_ids: materialMode === "auto" ? smartSelectedIds : selectedMaterials, - title_config: { - ai_auto_select: titleSettings.aiAutoSelect, - content: titleSettings.title, - position: titleSettings.position, - font_preset: titleSettings.font, - font_color: titleSettings.color, - font_size: titleSettings.size, - }, - cover_config: coverSettings, - ...voiceConfig, - ratio: videoRatio, - style, - duration, - auto_subtitles: autoSubtitles, - bgm, - generate_count: generateCount, - material_mode: materialMode, - }, - total_duration: duration, - status: "editing", - }) + await updateEditPlan(selectedTemplate, payload) await generateEditPlan(selectedTemplate) startPolling() @@ -125,25 +74,7 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { setGenerateError(finalMsg) message.error(finalMsg) } - }, [ - titleSettings, - selectedMaterials, - selectedVoice, - voiceMode, - selectedClonedVoice, - videoRatio, - style, - duration, - autoSubtitles, - bgm, - selectedTemplate, - generateCount, - materialMode, - coverSettings, - smartSelectedIds, - clearTimer, - startPolling, - ]) + }, [props, selectedTemplate, clearTimer, startPolling]) /* 重新生成(失败后重试) */ const retry = useCallback(() => { @@ -209,3 +140,4 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { } export default useGenerateVideo + -- 2.54.0 From e091c5beb74e036894746a0e2ac89e184f8a3aa3 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:00:17 +0800 Subject: [PATCH 3/6] =?UTF-8?q?test(generate):=20=E8=A1=A5=E5=85=85=20buil?= =?UTF-8?q?dPayload=20=E6=A8=A1=E5=9D=97=20smoke=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -- 2.54.0 From 9e6b8b01e3b75dac5fa84a79a097d4192ed863f9 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:33:44 +0800 Subject: [PATCH 4/6] fix(lint): Prettier format buildPayload --- apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts b/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts index f4db27a8c..6040cf875 100644 --- a/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts +++ b/apps/web/src/pages/generate/hooks/generate-video/buildPayload.ts @@ -74,4 +74,3 @@ export const validateGenerateInputs = (props: UseGenerateVideoProps): string | n } return null } - -- 2.54.0 From 3fded204bbd31146e25e73c0accd09c59eb83d18 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:33:45 +0800 Subject: [PATCH 5/6] fix(lint): Prettier format useGenerateVideo --- apps/web/src/pages/generate/hooks/useGenerateVideo.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts index 1abe14a44..d78fdaa17 100644 --- a/apps/web/src/pages/generate/hooks/useGenerateVideo.ts +++ b/apps/web/src/pages/generate/hooks/useGenerateVideo.ts @@ -140,4 +140,3 @@ export function useGenerateVideo(props: UseGenerateVideoProps) { } export default useGenerateVideo - -- 2.54.0 From fcc12367f2cd1355540c46dc8b74598e7acf5625 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Wed, 29 Jul 2026 22:34:21 +0800 Subject: [PATCH 6/6] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85=20buildPayload?= =?UTF-8?q?=20smoke=20test=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/test/pages/generate/smoke.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/src/test/pages/generate/smoke.test.tsx b/apps/web/src/test/pages/generate/smoke.test.tsx index 784ba7b0d..cbbe9d70a 100755 --- a/apps/web/src/test/pages/generate/smoke.test.tsx +++ b/apps/web/src/test/pages/generate/smoke.test.tsx @@ -42,3 +42,4 @@ import "@/pages/generate/hooks/generate-video/types" import "@/pages/generate/hooks/generate-video/phase" import "@/pages/generate/hooks/generate-video/voiceConfig" import "@/pages/generate/hooks/generate-video/errorUtils" +import "@/pages/generate/hooks/generate-video/buildPayload" -- 2.54.0