import { useEffect } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { useProjectStore } from '../stores/project' import { useTaskStore } from '../stores/task' import { useGenerationStore } from '../stores/generation' import { useToastStore } from '../stores/toast' import { extractTags } from '../api/prompt' import { mergeStyles } from '../utils/style' import type { GenerateRequest } from '../api/types' import ProjectConfigPanel from '../components/ProjectConfigPanel' import GenerateForm from '../components/GenerateForm' import ProgressBar from '../components/ProgressBar' import TaskListPanel from '../components/TaskListPanel' export default function ProjectDetailPage() { const { projectId = '' } = useParams() const navigate = useNavigate() const addToast = useToastStore(s => s.addToast) const { style: projectStyle } = useProjectStore() const taskStore = useTaskStore() const { status, stage, progress, taskId, statusText, retryCount, rejectReason, submit, reset: resetGeneration, } = useGenerationStore() // 重置生成状态(切换工程时) useEffect(() => { resetGeneration() taskStore.reset() }, [projectId]) // eslint-disable-line react-hooks/exhaustive-deps // 失败时 toast useEffect(() => { if (status === 'failed') { const errText = useGenerationStore.getState().error || '未知错误' addToast({ type: 'error', message: `素材生成失败:${errText}` }) } }, [status, addToast]) const handleSubmit = async (finalPrompt: string) => { const { taskStyle, params, enableAI, optimizedPrompt } = taskStore const mergedStyle = mergeStyles(projectStyle, taskStyle) const tags = extractTags(mergedStyle) const req: GenerateRequest = { projectId, prompt: enableAI && optimizedPrompt ? optimizedPrompt : finalPrompt, assetType: taskStore.assetType, tags, projectStyle, taskStyle, resolution: params.resolution, directions: params.frames?.directions, framesPerDir: params.frames?.framesPerDirection, format: params.format, } await submit(req) } const handleViewResult = () => { if (taskId) navigate(`/projects/${projectId}/tasks/${taskId}`) } const handleReset = () => { resetGeneration() taskStore.reset() } return (
{/* 左栏:工程配置 */} {/* 中间:生成表单 + 进度 */}
{/* 上半:生成表单 */}

新建生成

{/* 下半:当前任务进度 */} {status !== 'idle' && (

生成进度

{status === 'running' && (

{statusText || '管线执行中,请稍候...'}

)} {status === 'completed' && (

生成完成

)} {status === 'failed' && (

{useGenerationStore.getState().error || '生成失败'}

)}
)}
{/* 右栏:任务列表 */}
) }