Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import { useQuery } from '@tanstack/react-query'; import { Clock, Calendar, ChevronRight } from 'lucide-react'; import { Link } from 'react-router-dom'; import { api } from '../api/client'; interface PrinterQueueWidgetProps { printerId: number; } function formatRelativeTime(dateString: string | null): string { if (!dateString) return 'ASAP'; const date = new Date(dateString); 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 }: PrinterQueueWidgetProps) { const { data: queue } = useQuery({ queryKey: ['queue', printerId, 'pending'], queryFn: () => api.getQueue(printerId, 'pending'), refetchInterval: 30000, }); const nextItem = queue?.[0]; const totalPending = queue?.length || 0; if (totalPending === 0) { return null; } return ( <Link to="/queue" className="block mb-3 p-3 bg-bambu-dark rounded-lg hover:bg-bambu-dark-tertiary transition-colors" > <div className="flex items-center justify-between gap-3"> <div className="flex items-center gap-3 min-w-0 flex-1"> <Calendar className="w-5 h-5 text-yellow-400 flex-shrink-0" /> <div className="min-w-0 flex-1"> <p className="text-xs text-bambu-gray">Next in queue</p> <p className="text-sm text-white truncate"> {nextItem?.archive_name || `Archive #${nextItem?.archive_id}`} </p> </div> </div> <div className="flex items-center gap-2 flex-shrink-0"> <span className="text-xs text-bambu-gray flex items-center gap-1"> <Clock className="w-3 h-3" /> {formatRelativeTime(nextItem?.scheduled_time || null)} </span> {totalPending > 1 && ( <span className="text-xs px-1.5 py-0.5 bg-yellow-400/20 text-yellow-400 rounded"> +{totalPending - 1} </span> )} <ChevronRight className="w-4 h-4 text-bambu-gray" /> </div> </div> </Link> ); } |