16bc4f53bf
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m11s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1m15s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 1m34s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 2m15s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 2m19s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 2m50s
CI/CD Pipeline / Build Staging API Image (push) Successful in 3m54s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 52s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 37s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 3m24s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m28s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 6m49s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 6m57s
AI Code Review / AI Code Review (pull_request) Failing after 6m8s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 8m41s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 6m24s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 50s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m30s
CI/CD Pipeline / Integration Tests (push) Successful in 4m4s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m29s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 12m56s
CI/CD Pipeline / Unit Tests (push) Successful in 13m13s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 13m1s
CI/CD Pipeline / CI Gate (pull_request) Successful in 13s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 7m15s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 533h9m31s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 533h9m32s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 533h9m33s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 533h9m34s
CI/CD Pipeline / Production Browser E2E (push) Failing after 533h10m6s
CI/CD Pipeline / Canary Release to Production (push) Failing after 533h10m6s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 533h20m54s
CI/CD Pipeline / Deploy Production (push) Failing after 533h10m7s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 533h10m7s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 533h20m58s
CI/CD Pipeline / CI Gate (push) Failing after 533h10m7s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 533h21m0s
CI/CD Pipeline / Build Production Web Image (push) Failing after 533h10m8s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 533h21m56s
CI/CD Pipeline / Build Production API Image (push) Failing after 533h10m8s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 533h21m58s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 533h22m0s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 533h23m30s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 533h24m57s
CI/CD Pipeline / PR Build Web Image (push) Failing after 533h22m2s
CI/CD Pipeline / PR Build API Image (push) Failing after 533h22m4s
CI/CD Pipeline / Frontend Lint (push) Failing after 533h22m38s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 533h23m32s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 533h23m34s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 533h43m26s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 533h43m27s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 533h54m50s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 533h54m56s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
246 lines
7.7 KiB
TypeScript
246 lines
7.7 KiB
TypeScript
/**
|
|
* GeneratePage 步骤内容渲染
|
|
* 根据当前步骤渲染对应的 Step 组件
|
|
* 步骤顺序:模板(1) → 素材(2) → 配音(3) → 标题(4) → 预览(5) → 封面(6) → 确认(7)
|
|
*
|
|
* V24: 移除 Step5 预览生成相关 props,改为纯标题样式编辑
|
|
*/
|
|
import React from "react"
|
|
import type { EditingTemplate } from "@/api/editing-planner"
|
|
import type { PresetVoiceItem } from "@/api/voices"
|
|
import type { VoiceClone } from "@/api/voice-clone"
|
|
import type { CoverConfig } from "../types/cover"
|
|
import type { TitleSettings } from "../types"
|
|
import Step1TemplateSelect from "../components/Step1TemplateSelect"
|
|
import Step2MaterialSelect from "../components/Step2MaterialSelect"
|
|
import Step3VoiceSelect from "../components/Step5VoiceSelect"
|
|
import Step5GeneratePreview from "../components/Step5GeneratePreview"
|
|
import Step4TitleSettings from "../components/Step4TitleSettings"
|
|
import Step6CoverSettings from "../components/Step6CoverSettings"
|
|
import Step7ConfirmGenerate from "../components/Step7ConfirmGenerate"
|
|
import type { GeneratedVideo } from "@/api/template-editor"
|
|
|
|
export interface GenerateStepContentProps {
|
|
currentStep: number
|
|
/* 模板 */
|
|
userTemplates: EditingTemplate[]
|
|
selectedTemplate: string
|
|
onSelectTemplate: (id: string) => void
|
|
/* 素材 */
|
|
materialMode: "manual" | "auto"
|
|
onMaterialModeChange: (mode: "manual" | "auto") => void
|
|
selectedMaterials: string[]
|
|
onSelectedMaterialsChange: (ids: string[]) => void
|
|
smartSelectedIds: string[]
|
|
onSmartSelectedIdsChange: (ids: string[]) => void
|
|
/* 标题 */
|
|
titleSettings: TitleSettings
|
|
onTitleSettingsChange: (settings: TitleSettings) => void
|
|
/* 标题样式回调 — Step5 样式面板使用 */
|
|
onUpdatePosition: (position: string) => void
|
|
onUpdateFont: (font: string) => void
|
|
onUpdateSize: (size: number) => void
|
|
onToggleBold: () => void
|
|
onToggleItalic: () => void
|
|
onToggleStroke: () => void
|
|
onToggleShadow: () => void
|
|
onApplyPreset: (presetKey: string) => void
|
|
activePreset: string | null
|
|
titlePresets: { key: string; label: string; previewStyle: React.CSSProperties }[]
|
|
/* 封面 */
|
|
coverSettings: CoverConfig
|
|
onCoverSettingsChange: (settings: CoverConfig) => void
|
|
duration: number
|
|
/* 配音 */
|
|
selectedVoice: string
|
|
onSelectedVoiceChange: (id: string) => void
|
|
totalVideoDuration?: number
|
|
voiceMode: "preset" | "custom" | "clone"
|
|
onVoiceModeChange: (mode: "preset" | "custom" | "clone") => void
|
|
selectedClonedVoice: string
|
|
onSelectedClonedVoiceChange: (id: string) => void
|
|
clonedVoices: VoiceClone[]
|
|
addClone: (voice: VoiceClone) => void
|
|
hasProcessing: boolean
|
|
cloneModalOpen: boolean
|
|
onCloneModalOpenChange: (open: boolean) => void
|
|
/* 生成 */
|
|
generateCount: number
|
|
onGenerateCountChange: (n: number) => void
|
|
generating: boolean
|
|
generated: boolean
|
|
generateError: string | null
|
|
progress: number
|
|
generatedVideos: GeneratedVideo[]
|
|
onRetry: () => void
|
|
onDismissError: () => void
|
|
/* 其他 */
|
|
presetVoices: PresetVoiceItem[]
|
|
/** 预览任务创建回调——传递给 Step6CoverSettings */
|
|
onPreviewTaskCreated?: (taskId: string) => void
|
|
/** 从预览响应中提取到 source_edit_plan_id 时的回调 */
|
|
onSourceEditPlanIdExtracted?: (planId: string) => void
|
|
/** BGM 开关 */
|
|
bgm: boolean
|
|
/** BGM 配置(来自模板) */
|
|
bgmConfig?: { enabled: boolean; music_id?: string }
|
|
}
|
|
|
|
export const GenerateStepContent: React.FC<GenerateStepContentProps> = (props) => {
|
|
const {
|
|
currentStep,
|
|
userTemplates,
|
|
selectedTemplate,
|
|
onSelectTemplate,
|
|
materialMode,
|
|
onMaterialModeChange,
|
|
selectedMaterials,
|
|
onSelectedMaterialsChange,
|
|
smartSelectedIds,
|
|
onSmartSelectedIdsChange,
|
|
titleSettings,
|
|
onTitleSettingsChange,
|
|
onUpdatePosition,
|
|
onUpdateFont,
|
|
onUpdateSize,
|
|
onToggleBold,
|
|
onToggleItalic,
|
|
onToggleStroke,
|
|
onToggleShadow,
|
|
onApplyPreset,
|
|
activePreset,
|
|
titlePresets,
|
|
coverSettings,
|
|
onCoverSettingsChange,
|
|
duration,
|
|
selectedVoice,
|
|
onSelectedVoiceChange,
|
|
totalVideoDuration,
|
|
voiceMode,
|
|
selectedClonedVoice,
|
|
clonedVoices,
|
|
generateCount,
|
|
onGenerateCountChange,
|
|
generating,
|
|
generated,
|
|
generateError,
|
|
progress,
|
|
generatedVideos,
|
|
onRetry,
|
|
onDismissError,
|
|
presetVoices,
|
|
onPreviewTaskCreated,
|
|
onSourceEditPlanIdExtracted,
|
|
bgm,
|
|
bgmConfig,
|
|
} = props
|
|
|
|
/* 当前模板的 segments,传给 Step2 构建 clips */
|
|
const currentTemplate = userTemplates.find((t) => t.id === selectedTemplate)
|
|
const templateSegments = currentTemplate?.segments
|
|
|
|
switch (currentStep) {
|
|
case 1:
|
|
return (
|
|
<Step1TemplateSelect
|
|
templates={userTemplates}
|
|
selectedTemplate={selectedTemplate}
|
|
onSelectTemplate={onSelectTemplate}
|
|
/>
|
|
)
|
|
case 2:
|
|
return (
|
|
<Step2MaterialSelect
|
|
materialMode={materialMode}
|
|
onMaterialModeChange={onMaterialModeChange}
|
|
selectedMaterials={selectedMaterials}
|
|
onSelectedMaterialsChange={onSelectedMaterialsChange}
|
|
smartSelectedIds={smartSelectedIds}
|
|
onSmartSelectedIdsChange={onSmartSelectedIdsChange}
|
|
selectedTemplate={selectedTemplate}
|
|
templateSegments={templateSegments}
|
|
/>
|
|
)
|
|
case 3:
|
|
return (
|
|
<Step3VoiceSelect
|
|
selectedVoice={selectedVoice}
|
|
onSelectedVoiceChange={onSelectedVoiceChange}
|
|
totalVideoDuration={totalVideoDuration}
|
|
/>
|
|
)
|
|
case 4:
|
|
return (
|
|
<Step4TitleSettings
|
|
titleSettings={titleSettings}
|
|
onTitleSettingsChange={onTitleSettingsChange}
|
|
selectedTemplate={selectedTemplate}
|
|
/>
|
|
)
|
|
case 5:
|
|
return (
|
|
<Step5GeneratePreview
|
|
titleSettings={titleSettings}
|
|
onUpdatePosition={onUpdatePosition}
|
|
onUpdateFont={onUpdateFont}
|
|
onUpdateSize={onUpdateSize}
|
|
onToggleBold={onToggleBold}
|
|
onToggleItalic={onToggleItalic}
|
|
onToggleStroke={onToggleStroke}
|
|
onToggleShadow={onToggleShadow}
|
|
onApplyPreset={onApplyPreset}
|
|
activePreset={activePreset}
|
|
titlePresets={titlePresets}
|
|
/>
|
|
)
|
|
case 6:
|
|
return (
|
|
<Step6CoverSettings
|
|
coverSettings={coverSettings}
|
|
onCoverSettingsChange={onCoverSettingsChange}
|
|
duration={duration}
|
|
assetIds={materialMode === "auto" ? smartSelectedIds : selectedMaterials}
|
|
selectedTemplate={selectedTemplate}
|
|
titleSettings={titleSettings}
|
|
onPreviewTaskCreated={onPreviewTaskCreated}
|
|
onSourceEditPlanIdExtracted={onSourceEditPlanIdExtracted}
|
|
voiceMode={voiceMode}
|
|
selectedVoice={selectedVoice}
|
|
selectedClonedVoice={selectedClonedVoice}
|
|
bgm={bgm}
|
|
bgmConfig={bgmConfig}
|
|
/>
|
|
)
|
|
case 7:
|
|
return (
|
|
<Step7ConfirmGenerate
|
|
templates={userTemplates}
|
|
selectedTemplate={selectedTemplate}
|
|
materialMode={materialMode}
|
|
selectedMaterials={selectedMaterials}
|
|
smartSelectedIds={smartSelectedIds}
|
|
title={titleSettings.title}
|
|
voiceMode={voiceMode}
|
|
selectedVoice={selectedVoice}
|
|
selectedClonedVoice={selectedClonedVoice}
|
|
presetVoices={presetVoices}
|
|
clonedVoices={clonedVoices}
|
|
coverSettings={coverSettings}
|
|
generateCount={generateCount}
|
|
onGenerateCountChange={onGenerateCountChange}
|
|
generating={generating}
|
|
generated={generated}
|
|
generateError={generateError}
|
|
progress={progress}
|
|
generatedVideos={generatedVideos}
|
|
onRetry={onRetry}
|
|
onDismissError={onDismissError}
|
|
/>
|
|
)
|
|
default:
|
|
return null
|
|
}
|
|
}
|
|
|
|
export default GenerateStepContent
|