import { ANALYZE_COPY_MISSION_PIPELINE_STEPS } from '../lib/copyFlow' import { jobStatusBadgeClass, jobStatusLabel } from '../lib/jobStatus' import type { JobData } from '../types/api' import { ProgressBar, StatusBadge } from './ui' const STEP_STATUS_LABEL: Record = { pending: '等待', running: '進行中', succeeded: '完成', failed: '失敗', skipped: '略過', cancelled: '取消', } function analyzeJobHint(job: JobData): string { if (job.status === 'cancel_requested') { return '研究地圖任務取消中,通常幾秒內完成。' } if (job.status === 'queued' || job.status === 'pending') { return '任務已排隊,背景 worker 即將接手…' } return job.progress?.summary?.trim() || '研究地圖產生中,請稍候…' } export function CopyMissionAnalyzeJobPanel({ job }: { job: JobData }) { const steps = job.progress?.steps ?? [] const stepMap = new Map(steps.map((s) => [s.id, s])) const pct = job.progress?.percentage ?? 0 return (

{analyzeJobHint(job)}

{jobStatusLabel(job.status)} {pct}%
    {ANALYZE_COPY_MISSION_PIPELINE_STEPS.map((step) => { const live = stepMap.get(step.id) const status = live?.status ?? 'pending' const isDone = status === 'succeeded' || status === 'done' const isRunning = status === 'running' return (
  1. {step.title} · {STEP_STATUS_LABEL[status] ?? status}
  2. ) })}
{job.error ? (

錯誤:{job.error}

) : null}
) }