import { ChevronDown, Clock3, Download, Film, ImageIcon, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { saveImageWorkspaceAsset } from '@/lib/image-workspace'; import { cn } from '@/lib/utils'; import type { DesignGenerationTask, DesignWorkspace } from '../../../shared/image-workspace'; import { DesignAssetThumbnail } from './DesignAssetThumbnail'; import { youthTaskIssueMessage } from './youth-issue-copy'; const STATUS_LABELS: Record = { queued: '等待制作', running: '制作中', succeeded: '已完成', failed: '未完成', cancelled: '已取消', }; function formatTime(value: string): string { const timestamp = Date.parse(value); if (!Number.isFinite(timestamp)) return ''; const date = new Date(timestamp); const now = new Date(); return date.toDateString() === now.toDateString() ? `今天 ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}` : date.toLocaleDateString([], { month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit' }); } function taskDescription(task: DesignGenerationTask): string { const parts = [ task.medium === 'video' ? '视频' : '图片', task.outputSummary.aspectRatio, ]; if (task.outputSummary.durationSeconds) parts.push(`${task.outputSummary.durationSeconds} 秒`); parts.push(`${task.outputSummary.outputCount} 个`); return parts.join(' · '); } export function DesignPlanHistory({ workspace }: { workspace: DesignWorkspace }) { const tasks = [...workspace.tasks].sort( (left, right) => Date.parse(right.createdAt) - Date.parse(left.createdAt), ); if (tasks.length === 0) return null; return (
{tasks.map((task) => { const resultAssets = task.resultAssetIds .map((assetId) => workspace.assets.find((asset) => asset.assetId === assetId) ?? null) .filter((asset): asset is NonNullable => Boolean(asset)); const preview = resultAssets[0] ?? workspace.assets.find((asset) => asset.generationTaskId === task.taskId) ?? null; const active = task.status === 'queued' || task.status === 'running'; return (
制作记录 {active && {taskDescription(task)} · {Math.ceil(task.maximumCustomerChargeAtoms / 100)} 设计点 {formatTime(task.createdAt)}
{task.medium === 'video' ? : } {taskDescription(task)} {task.progress.completedRequiredSteps}/{task.progress.totalRequiredSteps} 步
{task.issues.length > 0 && (
{task.issues.map((issue) =>

{youthTaskIssueMessage(issue)}

)}
)} {resultAssets.length > 0 && (
{resultAssets.map((asset) => (
))}
)}
); })}
); }