'use client'; import { useEffect, useState } from 'react'; import { clsx } from 'clsx'; import { CheckCircle, XCircle, Loader2 } from 'lucide-react'; import { jobsApi } from '@/lib/api'; interface JobProgressProps { jobId: string; onComplete?: (job: any) => void; onError?: (error: string) => void; } export default function JobProgress({ jobId, onComplete, onError }: JobProgressProps) { const [job, setJob] = useState(null); const [polling, setPolling] = useState(true); useEffect(() => { if (!jobId || !polling) return; const pollJob = async () => { try { const response = await jobsApi.get(jobId); const jobData = response.data; setJob(jobData); if (jobData.status === 'completed') { setPolling(false); onComplete?.(jobData); } else if (jobData.status === 'failed') { setPolling(false); onError?.(jobData.error_message || 'Job failed'); } } catch (err) { console.error('Failed to poll job:', err); } }; pollJob(); const interval = setInterval(pollJob, 2000); return () => clearInterval(interval); }, [jobId, polling, onComplete, onError]); if (!job) { return (
Starting job...
); } return (
{job.status === 'completed' && ( )} {job.status === 'failed' && ( )} {(job.status === 'pending' || job.status === 'processing') && ( )} {job.status}
{job.progress}%
{job.api_provider && (

Using: {job.api_provider} {job.api_model && `(${job.api_model})`}

)} {job.error_message && (

{job.error_message}

)}
); }