"use client"; import { useState } from "react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { useTranslations } from "next-intl"; import { Printer } from "lucide-react"; import { apiGet } from "@/lib/api/client"; import { printErrorMessage, testPrinter } from "@/lib/api/print"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { cn } from "@/lib/utils"; type BranchPrintSettings = { receiptPrinterIp?: string | null; receiptPrinterPort?: number | null; kitchenPrinterIp?: string | null; kitchenPrinterPort?: number | null; }; type SettingsPrintTestPanelProps = { cafeId: string; onOpenPrinterSettings?: () => void; }; function printerEndpointLabel( ip: string | null | undefined, port: number | null | undefined ): string { if (!ip?.trim()) return "—"; return `${ip.trim()}:${port ?? 9100}`; } export function SettingsPrintTestPanel({ cafeId, onOpenPrinterSettings, }: SettingsPrintTestPanelProps) { const t = useTranslations("print"); const tSettings = useTranslations("settings"); const tCommon = useTranslations("common"); const [message, setMessage] = useState(null); const [lastTarget, setLastTarget] = useState<"receipt" | "kitchen" | null>(null); const { data: branches = [], isLoading: branchesLoading } = useQuery({ queryKey: ["branches", cafeId], queryFn: () => apiGet<{ id: string }[]>(`/api/cafes/${cafeId}/branches`), enabled: !!cafeId, }); const branchId = branches[0]?.id; const { data: settings, isLoading: settingsLoading } = useQuery({ queryKey: ["branch-print-settings", cafeId, branchId], queryFn: () => apiGet( `/api/cafes/${cafeId}/branches/${branchId}/print-settings` ), enabled: !!cafeId && !!branchId, }); const runTest = useMutation({ mutationFn: (target: "receipt" | "kitchen") => { const ip = target === "receipt" ? settings?.receiptPrinterIp?.trim() : settings?.kitchenPrinterIp?.trim(); const port = target === "receipt" ? settings?.receiptPrinterPort ?? 9100 : settings?.kitchenPrinterPort ?? 9100; if (!ip) throw new Error("PRINTER_NOT_CONFIGURED"); return testPrinter(cafeId, ip, port); }, onMutate: (target) => setLastTarget(target), onSuccess: () => setMessage(t("success")), onError: (err) => setMessage(printErrorMessage(err, t)), }); const isLoading = branchesLoading || settingsLoading; const receiptReady = !!settings?.receiptPrinterIp?.trim(); const kitchenReady = !!settings?.kitchenPrinterIp?.trim(); if (isLoading) { return

{tCommon("loading")}

; } if (!branchId) { return (

{t("noBranchForPrinter")}

); } return (
{tSettings("nav.printTest")}

{t("testPageHint")}

{message ? (

{message}

) : null}

{t("receiptPrinter")}

{printerEndpointLabel( settings?.receiptPrinterIp, settings?.receiptPrinterPort )}

{!receiptReady ? (

{t("notConfigured")}

) : null}

{t("kitchenPrinter")}

{printerEndpointLabel( settings?.kitchenPrinterIp, settings?.kitchenPrinterPort )}

{!kitchenReady ? (

{t("notConfigured")}

) : null}
{onOpenPrinterSettings ? ( ) : null}
); }