From aa36e7ae6224368cd51447d205998b4a3a0cd6b7 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 13:49:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(generate):=20=E6=8B=86=E5=88=86use?= =?UTF-8?q?Step5Voice=E6=A8=A1=E5=BC=8F=E9=80=89=E6=8B=A9=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=B0=E5=AD=90Hook=EF=BC=88184=E2=86=92165?= =?UTF-8?q?=E8=A1=8C,=20-10%=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step5-voice/useVoiceModeSelection.ts | 70 +++++++++++++++++++ .../pages/generate/hooks/useStep5Voice.tsx | 67 +++++++----------- 2 files changed, 94 insertions(+), 43 deletions(-) create mode 100755 apps/web/src/pages/generate/hooks/step5-voice/useVoiceModeSelection.ts mode change 100644 => 100755 apps/web/src/pages/generate/hooks/useStep5Voice.tsx diff --git a/apps/web/src/pages/generate/hooks/step5-voice/useVoiceModeSelection.ts b/apps/web/src/pages/generate/hooks/step5-voice/useVoiceModeSelection.ts new file mode 100755 index 000000000..3eaf0d64d --- /dev/null +++ b/apps/web/src/pages/generate/hooks/step5-voice/useVoiceModeSelection.ts @@ -0,0 +1,70 @@ +import { useCallback } from "react" +import type { VoiceClone } from "@/api/voice-clone" + +interface UseVoiceModeSelectionOptions { + selectedVoice: string + onSelectedVoiceChange: (voiceId: string) => void + voiceMode: "preset" | "custom" | "clone" + onVoiceModeChange: (mode: "preset" | "custom" | "clone") => void + selectedClonedVoice: string + onSelectedClonedVoiceChange: (voiceId: string) => void + addClone: (voice: VoiceClone) => void + cloneModalOpen: boolean + onCloneModalOpenChange: (open: boolean) => void +} + +export function useVoiceModeSelection({ + onSelectedVoiceChange, + onVoiceModeChange, + onSelectedClonedVoiceChange, + addClone, + onCloneModalOpenChange, +}: UseVoiceModeSelectionOptions) { + const handleSelectRecommendedVoice = useCallback( + (voiceId: string) => { + onVoiceModeChange("preset") + onSelectedVoiceChange(voiceId) + }, + [onVoiceModeChange, onSelectedVoiceChange], + ) + + const handleSelectPresetVoice = useCallback( + (voiceId: string) => { + onVoiceModeChange("preset") + onSelectedVoiceChange(voiceId) + }, + [onVoiceModeChange, onSelectedVoiceChange], + ) + + const handleSelectCloneVoice = useCallback(() => { + onVoiceModeChange("clone") + }, [onVoiceModeChange]) + + const handleSelectClonedVoice = useCallback( + (voiceId: string) => { + onSelectedClonedVoiceChange(voiceId) + }, + [onSelectedClonedVoiceChange], + ) + + const handleOpenCloneModal = useCallback(() => { + onCloneModalOpenChange(true) + }, [onCloneModalOpenChange]) + + const handleCloneSuccess = useCallback( + (voice: VoiceClone) => { + addClone(voice) + onCloneModalOpenChange(false) + }, + [addClone, onCloneModalOpenChange], + ) + + return { + handleSelectRecommendedVoice, + handleSelectPresetVoice, + handleSelectCloneVoice, + handleSelectClonedVoice, + handleOpenCloneModal, + handleCloneSuccess, + } +} diff --git a/apps/web/src/pages/generate/hooks/useStep5Voice.tsx b/apps/web/src/pages/generate/hooks/useStep5Voice.tsx old mode 100644 new mode 100755 index 54a85fd28..ca630c3a3 --- a/apps/web/src/pages/generate/hooks/useStep5Voice.tsx +++ b/apps/web/src/pages/generate/hooks/useStep5Voice.tsx @@ -2,15 +2,15 @@ * Step 5 配音选择 Hook * 封装 AI 推荐、预设音色试听、TTS 自定义合成、存为素材等逻辑 */ -import { useCallback } from "react" -import type { VoiceClone } from "@/api/voice-clone" import { message } from "antd" +import type { VoiceClone } from "@/api/voice-clone" import { VOICE_GENDER_ICON, CLONE_STATUS_CONFIG } from "../constants" import { formatDuration } from "../utils/formatDuration" import { useVoiceAudio } from "./step5-voice/useVoiceAudio" import { useVoiceRecommend } from "./step5-voice/useVoiceRecommend" import { useTtsSynthesis } from "./step5-voice/useTtsSynthesis" import { useSaveToLibrary } from "./step5-voice/useSaveToLibrary" +import { useVoiceModeSelection } from "./step5-voice/useVoiceModeSelection" interface UseStep5VoiceProps { selectedVoice: string @@ -81,48 +81,29 @@ export function useStep5Voice({ handleAddTagInModal, } = useSaveToLibrary(completedTtsJobId, resetTtsState) - /* ── 推荐音色选择 ── */ - const handleSelectRecommendedVoice = useCallback( - (voiceId: string) => { - onVoiceModeChange("preset") - onSelectedVoiceChange(voiceId) - }, - [onVoiceModeChange, onSelectedVoiceChange], - ) + const { + handleSelectRecommendedVoice, + handleSelectPresetVoice, + handleSelectCloneVoice, + handleSelectClonedVoice, + handleOpenCloneModal, + handleCloneSuccess: rawCloneSuccess, + } = useVoiceModeSelection({ + selectedVoice, + onSelectedVoiceChange, + voiceMode, + onVoiceModeChange, + selectedClonedVoice, + onSelectedClonedVoiceChange, + addClone, + cloneModalOpen, + onCloneModalOpenChange, + }) - /* ── 克隆成功回调 ── */ - const handleCloneSuccess = useCallback( - (voice: VoiceClone) => { - addClone(voice) - onCloneModalOpenChange(false) - message.success("音色克隆成功!") - }, - [addClone, onCloneModalOpenChange], - ) - - /* ── 预设音色选择操作 ── */ - const handleSelectPresetVoice = useCallback( - (voiceId: string) => { - onVoiceModeChange("preset") - onSelectedVoiceChange(voiceId) - }, - [onVoiceModeChange, onSelectedVoiceChange], - ) - - const handleSelectCloneVoice = useCallback(() => { - onVoiceModeChange("clone") - }, [onVoiceModeChange]) - - const handleSelectClonedVoice = useCallback( - (voiceId: string) => { - onSelectedClonedVoiceChange(voiceId) - }, - [onSelectedClonedVoiceChange], - ) - - const handleOpenCloneModal = useCallback(() => { - onCloneModalOpenChange(true) - }, [onCloneModalOpenChange]) + const handleCloneSuccess = (voice: VoiceClone) => { + rawCloneSuccess(voice) + message.success("音色克隆成功!") + } return { // 数据 -- 2.54.0 From 4750e67c5546aedaabca25563301d7df6c64d217 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 15:13:32 +0800 Subject: [PATCH 2/2] chore: retrigger CI -- 2.54.0