import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { X, Copy, Check, Signal } from 'lucide-react'; import { Card, CardContent } from './Card'; import { formatDateOnly } from '../utils/date'; import { getPrinterImage, getWifiStrength } from '../utils/printer'; import type { Printer, PrinterStatus } from '../api/client'; interface PrinterInfoModalProps { printer: Printer; status?: PrinterStatus; totalPrintHours?: number; onClose: () => void; } function CopyButton({ value }: { value: string }) { const { t } = useTranslation(); const [copied, setCopied] = useState(false); const handleCopy = async () => { try { await navigator.clipboard.writeText(value); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch { // Clipboard may not be available in non-secure contexts } }; return ( ); } export function PrinterInfoModal({ printer, status, totalPrintHours, onClose }: PrinterInfoModalProps) { const { t } = useTranslation(); useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', handleKey); return () => window.removeEventListener('keydown', handleKey); }, [onClose]); const rows: { label: string; value: React.ReactNode }[] = []; // Model rows.push({ label: t('printers.model'), value: printer.model ?? '—', }); // Connection Status rows.push({ label: t('common.status'), value: ( {status?.connected ? t('printers.status.available') : t('printers.status.offline')} ), }); // State if (status?.state) { const stateMap: Record = { IDLE: 'printers.status.idle', RUNNING: 'printers.status.printing', PAUSE: 'printers.status.paused', FINISH: 'printers.status.finished', FAILED: 'printers.status.error', }; rows.push({ label: t('printers.state'), value: t(stateMap[status.state] ?? 'printers.status.unknown'), }); } // IP Address rows.push({ label: t('printers.ipAddress'), value: ( {printer.ip_address} ), }); // Serial Number rows.push({ label: t('printers.serialNumber'), value: ( {printer.serial_number} ), }); // WiFi Signal if (status?.wifi_signal != null) { const wifi = getWifiStrength(status.wifi_signal); rows.push({ label: t('printers.wifiSignalLabel'), value: ( {t(wifi.labelKey)} ({status.wifi_signal} dBm) ), }); } // Firmware rows.push({ label: t('printers.firmware'), value: status?.firmware_version ?? '—', }); // Developer Mode if (status?.developer_mode != null) { rows.push({ label: t('printers.developerMode'), value: ( {status.developer_mode ? t('printers.enabled') : t('printers.disabled')} ), }); } // Nozzle Count rows.push({ label: t('printers.nozzleCount'), value: printer.nozzle_count, }); // SD Card if (status?.sdcard != null) { rows.push({ label: t('printers.sdCard'), value: ( {status.sdcard ? t('printers.inserted') : t('printers.notInserted')} ), }); } // Auto-Archive rows.push({ label: t('printers.autoArchive'), value: ( {printer.auto_archive ? t('printers.enabled') : t('printers.disabled')} ), }); // Total Print Hours if (totalPrintHours != null && totalPrintHours > 0) { rows.push({ label: t('printers.totalPrintHours'), value: `${Math.round(totalPrintHours)}h`, }); } // Location if (printer.location) { rows.push({ label: t('printers.sort.location'), value: printer.location, }); } // Added date rows.push({ label: t('printers.addedOn'), value: formatDateOnly(printer.created_at), }); return (
e.stopPropagation()}>

{printer.name}

{/* Printer Image */}
{printer.model
{rows.map((row, i) => (
{row.label} {row.value}
))}
); }