/** * GeneratePage 步骤导航 * 管理步骤切换与各步骤的前置校验 * 步骤顺序:模板(1) → 素材(2) → 配音(3) → 标题(4) → 预览(5) → 封面(6) → 确认(7) * * V24: previewReady 改为前端素材加载状态 */ import { message } from "antd" import type { TitleSettings } from "../types" export interface UseStepNavigationOptions { currentStep: number setCurrentStep: (step: number | ((prev: number) => number)) => void selectedTemplate: string materialMode: "manual" | "auto" selectedMaterials: string[] smartSelectedIds: string[] titleSettings: TitleSettings /** 预览是否就绪(前端素材已加载) */ previewReady: boolean } export interface UseStepNavigationReturn { goNext: () => void goPrev: () => void } export const useStepNavigation = (options: UseStepNavigationOptions): UseStepNavigationReturn => { const { currentStep, setCurrentStep, selectedTemplate, materialMode, selectedMaterials, smartSelectedIds, titleSettings, previewReady, } = options const goNext = () => { if (currentStep === 1 && !selectedTemplate) { message.warning("请先选择一个模板") return } if (currentStep === 2 && materialMode === "manual" && selectedMaterials.length === 0) { message.warning("请至少选择一个素材") return } if (currentStep === 2 && materialMode === "auto" && smartSelectedIds.length === 0) { message.warning("请先进行智能匹配并选择素材") return } // Step3 配音:配音为可选项,不强制校验,用户可跳过 if (currentStep === 4 && !titleSettings.title.trim()) { message.warning("请选择或输入标题") return } if (currentStep === 5 && !previewReady) { message.warning("请先选择素材以预览效果") return } if (currentStep < 7) { setCurrentStep((s) => s + 1) } } const goPrev = () => { if (currentStep > 1) { setCurrentStep((s) => s - 1) } } return { goNext, goPrev } } export default useStepNavigation