import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Clock, Calendar, ChevronRight, Loader2, CircleCheck } from 'lucide-react'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { api } from '../api/client'; import { useAuth } from '../contexts/AuthContext'; import { useToast } from '../contexts/ToastContext'; import { parseUTCDate } from '../utils/date'; interface PrinterQueueWidgetProps { printerId: number; printerState?: string | null; plateCleared?: boolean; } function formatRelativeTime(dateString: string | null): string { if (!dateString) return 'ASAP'; const date = parseUTCDate(dateString); if (!date) return 'ASAP'; const now = new Date(); const diff = date.getTime() - now.getTime(); if (diff < 0) return 'Now'; if (diff < 60000) return 'In <1 min'; if (diff < 3600000) return `In ${Math.round(diff / 60000)} min`; if (diff < 86400000) return `In ${Math.round(diff / 3600000)}h`; return date.toLocaleDateString(); } export function PrinterQueueWidget({ printerId, printerState, plateCleared }: PrinterQueueWidgetProps) { const { t } = useTranslation(); const queryClient = useQueryClient(); const { showToast } = useToast(); const { hasPermission } = useAuth(); const { data: queue } = useQuery({ queryKey: ['queue', printerId, 'pending'], queryFn: () => api.getQueue(printerId, 'pending'), refetchInterval: 30000, }); const clearPlateMutation = useMutation({ mutationFn: () => api.clearPlate(printerId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['queue', printerId] }); queryClient.invalidateQueries({ queryKey: ['printerStatus', printerId] }); showToast(t('queue.clearPlateSuccess'), 'success'); }, onError: (err: Error) => { showToast(err.message, 'error'); }, }); const nextItem = queue?.[0]; const totalPending = queue?.length || 0; if (totalPending === 0) { return null; } const needsClearPlate = (printerState === 'FINISH' || printerState === 'FAILED') && !plateCleared; if (needsClearPlate) { return (
{t('queue.nextInQueue')}
{nextItem?.archive_name || nextItem?.library_file_name || `File #${nextItem?.archive_id || nextItem?.library_file_id}`}
{t('queue.nextInQueue')}
{nextItem?.archive_name || nextItem?.library_file_name || `File #${nextItem?.archive_id || nextItem?.library_file_id}`}