/** * GeneratePage 步骤导航 * 管理步骤切换与各步骤的前置校验 */ 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 } export interface UseStepNavigationReturn { goNext: () => void goPrev: () => void } export const useStepNavigation = (options: UseStepNavigationOptions): UseStepNavigationReturn => { const { currentStep, setCurrentStep, selectedTemplate, materialMode, selectedMaterials, smartSelectedIds, titleSettings, } = 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 } if (currentStep === 4 && !titleSettings.title.trim()) { message.warning("请选择或输入标题") return } if (currentStep < 7) { setCurrentStep((s) => s + 1) } } const goPrev = () => { if (currentStep > 1) { setCurrentStep((s) => s - 1) } } return { goNext, goPrev } }