import { useQuery } from '@tanstack/react-query' import { Activity } from 'lucide-react' import api from '../../../api/client' interface ActivityEntry { cad_file_id: string original_name: string processing_status: string created_at: string } interface ActivityResponse { cad_processing: ActivityEntry[] render_jobs: ActivityEntry[] } function Skeleton() { return (
{[0, 1, 2].map((i) => (
))}
) } export default function QueueStatusWidget() { const { data, isLoading, error } = useQuery({ queryKey: ['worker-activity-widget'], queryFn: async () => { const res = await api.get('/worker/activity') return res.data as ActivityResponse }, refetchInterval: 15_000, staleTime: 10_000, retry: 1, }) if (isLoading) return if (error) { return

Failed to load queue status

} const entries = data?.cad_processing ?? [] const processing = entries.filter((e) => e.processing_status === 'processing').length const failed = entries.filter((e) => e.processing_status === 'failed').length const recent = entries.slice(0, 5) const statusDot = processing > 0 ? 'bg-blue-500' : failed > 0 ? 'bg-red-500' : 'bg-green-500' const statusLabel = processing > 0 ? `${processing} processing` : failed > 0 ? `${failed} failed` : 'Idle' return (
{/* Summary row */}
{statusLabel} {entries.length} recent tasks
{/* Recent activity */}
{recent.length === 0 && (

No recent activity

)} {recent.map((entry) => (
{entry.original_name} {entry.processing_status}
))}
) }