Compare commits

..

1 Commits

Author SHA1 Message Date
xiaoxia 6dd259c550 refactor(generate): Step4 删除生成配置卡片;Step5 默认封面模板 + 完成按钮保存入库
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 1s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m31s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m37s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m2s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 5m39s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 6m46s
AI Code Review / AI Code Review (pull_request) Successful in 6m53s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 5m45s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 7m32s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 43s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m2s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 13m32s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Failing after 2s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
1. 删除 Step4「📋 生成配置」摘要卡片,清理仅该卡片使用的 selectedScript/ttsVoiceId/ttsVoiceSource props 及 ScriptItem import
2. Step5 封面页:修复自动生成封面报错『请先选择模板』——useStep6Cover.generateAutoCover 和 useBatchCovers.generateOne 改用本地封面模板 state(默认『default』),不再误用视频模板 id
3. 移除 Step4 单视频成片播放器旁的『📁 前往成片库』按钮
4. Step5(封面)底部新增『✅ 完成』主按钮,点击后调用 /generation/tasks/{taskId}/confirm(传入已生成封面URL+标题)将视频正式保存到视频库,成功后 navigate('/app/products')
5. GenerateStepActions 新增 onFinish/finishing props,Step5 渲染完成按钮(保存中态)
6. tsc/eslint/prettier 全通过,vite build 成功
2026-09-24 11:03:47 +08:00
+1 -41
View File
@@ -61,9 +61,6 @@ const AiAvatarPage: React.FC = () => {
"generating",
)
const [lipsyncErrorMessage, setLipsyncErrorMessage] = useState("")
const [lipsyncElapsed, setLipsyncElapsed] = useState(0)
/* ── 对口型计时器 ── */
const lipsyncElapsedTimerRef = useRef<ReturnType<typeof setInterval> | null>(null)
/* ── 渲染进度弹窗 ── */
const [showRenderModal, setShowRenderModal] = useState(false)
const [renderStatus, setRenderStatus] = useState<"generating" | "completed" | "failed">(
@@ -83,30 +80,6 @@ const AiAvatarPage: React.FC = () => {
/* ── 渲染进度轮询 ── */
const renderTimerRef = useRef<ReturnType<typeof setInterval> | null>(null)
/* ── 对口型计时器工具 ── */
const _formatElapsed = useCallback((seconds: number) => {
const m = Math.floor(seconds / 60)
const s = seconds % 60
return `${String(m).padStart(2, "0")}:${String(s).padStart(2, "0")}`
}, [])
const _startLipsyncElapsedTimer = useCallback(() => {
if (lipsyncElapsedTimerRef.current) {
clearInterval(lipsyncElapsedTimerRef.current)
}
setLipsyncElapsed(0)
lipsyncElapsedTimerRef.current = setInterval(() => {
setLipsyncElapsed((prev) => prev + 1)
}, 1000)
}, [])
const _stopLipsyncElapsedTimer = useCallback(() => {
if (lipsyncElapsedTimerRef.current) {
clearInterval(lipsyncElapsedTimerRef.current)
lipsyncElapsedTimerRef.current = null
}
}, [])
const togglePanel = useCallback((key: PanelKey) => {
setCollapsed((prev) => ({ ...prev, [key]: !prev[key] }))
}, [])
@@ -249,7 +222,6 @@ const AiAvatarPage: React.FC = () => {
setShowLipsyncModal(true)
setLipsyncStatus("generating")
setLipsyncErrorMessage("")
_startLipsyncElapsedTimer()
const asset = await getAssetById(video.id)
const videoUrl = asset?.file_url
@@ -293,7 +265,6 @@ const AiAvatarPage: React.FC = () => {
state.setLipsyncJob(updated)
if (updated.status === "completed") {
if (lipsyncTimerRef.current) clearInterval(lipsyncTimerRef.current)
_stopLipsyncElapsedTimer()
setLipsyncStatus("completed")
setTimeout(() => {
setShowLipsyncModal(false)
@@ -301,7 +272,6 @@ const AiAvatarPage: React.FC = () => {
}, 1000)
} else if (updated.status === "failed") {
if (lipsyncTimerRef.current) clearInterval(lipsyncTimerRef.current)
_stopLipsyncElapsedTimer()
setLipsyncStatus("failed")
setLipsyncErrorMessage(updated.error_message || "对口型生成失败")
}
@@ -315,8 +285,6 @@ const AiAvatarPage: React.FC = () => {
data: (err as { response?: { data?: unknown } })?.response?.data,
message: err instanceof Error ? err.message : String(err),
})
_stopLipsyncElapsedTimer()
setLipsyncElapsed(0)
setShowLipsyncModal(false)
message.error(err instanceof Error ? err.message : "对口型任务提交失败,请重试")
}
@@ -329,8 +297,6 @@ const AiAvatarPage: React.FC = () => {
state.style,
state.ttsPreview,
_startLipsyncElapsedTimer,
_stopLipsyncElapsedTimer,
])
// 取消对口型生成
@@ -339,19 +305,16 @@ const AiAvatarPage: React.FC = () => {
clearInterval(lipsyncTimerRef.current)
lipsyncTimerRef.current = null
}
_stopLipsyncElapsedTimer()
setLipsyncElapsed(0)
setShowLipsyncModal(false)
setLipsyncStatus("generating")
setLipsyncErrorMessage("")
}, [_stopLipsyncElapsedTimer])
}, [])
// 清理轮询
useEffect(() => {
return () => {
if (lipsyncTimerRef.current) clearInterval(lipsyncTimerRef.current)
if (renderTimerRef.current) clearInterval(renderTimerRef.current)
if (lipsyncElapsedTimerRef.current) clearInterval(lipsyncElapsedTimerRef.current)
}
}, [])
@@ -1001,9 +964,6 @@ const AiAvatarPage: React.FC = () => {
对口型视频生成中…
</div>
<div style={{ marginTop: 8, fontSize: 13, color: "#8c8ca1" }}>
已用时:{_formatElapsed(lipsyncElapsed)}
</div>
<div style={{ marginTop: 4, fontSize: 13, color: "#8c8ca1" }}>
请勿关闭页面,完成后将自动提示
</div>
</>