import { useState, useEffect, useMemo } from 'react'; import { useQuery, useQueries } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { WifiOff } from 'lucide-react'; import { api, type Printer } from '../../api/client'; interface SpoolBuddyTopBarProps { selectedPrinterId: number | null; onPrinterChange: (id: number) => void; deviceOnline: boolean; } export function SpoolBuddyTopBar({ selectedPrinterId, onPrinterChange, deviceOnline }: SpoolBuddyTopBarProps) { const { t } = useTranslation(); const [currentTime, setCurrentTime] = useState(new Date()); const { data: printers = [] } = useQuery({ queryKey: ['printers'], queryFn: () => api.getPrinters(), }); // Fetch status for each printer to determine which are online const statusQueries = useQueries({ queries: printers.map((printer: Printer) => ({ queryKey: ['printerStatus', printer.id], queryFn: () => api.getPrinterStatus(printer.id), refetchInterval: 10000, })), }); const onlinePrinters = useMemo(() => { return printers.filter((_: Printer, i: number) => statusQueries[i]?.data?.connected); }, [printers, statusQueries]); // Auto-select first online printer useEffect(() => { const currentStillOnline = onlinePrinters.some((p: Printer) => p.id === selectedPrinterId); if ((!selectedPrinterId || !currentStillOnline) && onlinePrinters.length > 0) { onPrinterChange(onlinePrinters[0].id); } }, [onlinePrinters, selectedPrinterId, onPrinterChange]); // Clock - update every second for kiosk display useEffect(() => { const timer = setInterval(() => setCurrentTime(new Date()), 1000); return () => clearInterval(timer); }, []); const formatTime = (date: Date) => date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); return (