"use client"; import SearchBox, { Criterion } from "../SearchBox"; import { useCallback, useMemo, useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import SearchResults, { Column } from "../SearchResults/index"; import EditNote from "@mui/icons-material/EditNote"; import DeleteIcon from "@mui/icons-material/Delete"; import { useRouter } from "next/navigation"; import { deleteDialog, successDialog } from "../Swal/CustomAlerts"; import { PrinterResult } from "@/app/api/settings/printer"; import { deletePrinter } from "@/app/api/settings/printer/actions"; import PrinterSearchLoading from "./PrinterSearchLoading"; interface Props { printers: PrinterResult[]; } type SearchQuery = Partial>; type SearchParamNames = keyof SearchQuery; const PrinterSearch: React.FC = ({ printers }) => { const { t } = useTranslation("common"); const [filteredPrinters, setFilteredPrinters] = useState(printers); const [pagingController, setPagingController] = useState({ pageNum: 1, pageSize: 10, }); const router = useRouter(); const [isSearching, setIsSearching] = useState(false); useEffect(() => { console.log("Printers prop changed:", printers); setFilteredPrinters(printers); }, [printers]); const searchCriteria: Criterion[] = useMemo( () => [ { label: t("Name"), paramName: "name", type: "text", }, { label: "IP", paramName: "ip", type: "text", }, { label: t("Type"), paramName: "type", type: "text", }, ], [t], ); const onPrinterClick = useCallback( (printer: PrinterResult) => { console.log(printer); router.push(`/settings/printer/edit?id=${printer.id}`); }, [router], ); const onDeleteClick = useCallback((printer: PrinterResult) => { deleteDialog(async () => { try { console.log("Deleting printer with id:", printer.id); const result = await deletePrinter(printer.id); console.log("Delete result:", result); setFilteredPrinters(prev => prev.filter(p => p.id !== printer.id)); router.refresh(); setTimeout(() => { successDialog(t("Delete Success") || "刪除成功", t); }, 100); } catch (error) { console.error("Failed to delete printer:", error); const errorMessage = error instanceof Error ? error.message : (t("Delete Failed") || "刪除失敗"); alert(errorMessage); router.refresh(); } }, t); }, [t, router]); const columns = useMemo[]>( () => [ { name: "action", label: t("Edit"), onClick: onPrinterClick, buttonIcon: , sx: { width: "10%", minWidth: "80px" }, }, { name: "name", label: t("Name"), align: "left", headerAlign: "left", sx: { width: "20%", minWidth: "120px" }, }, { name: "description", label: t("Description"), align: "left", headerAlign: "left", sx: { width: "20%", minWidth: "140px" }, }, { name: "ip", label: "IP", align: "left", headerAlign: "left", sx: { width: "15%", minWidth: "100px" }, }, { name: "port", label: "Port", align: "left", headerAlign: "left", sx: { width: "10%", minWidth: "80px" }, }, { name: "type", label: t("Type"), align: "left", headerAlign: "left", sx: { width: "15%", minWidth: "100px" }, }, { name: "dpi", label: "DPI", align: "left", headerAlign: "left", sx: { width: "10%", minWidth: "80px" }, }, { name: "action", label: t("Delete"), onClick: onDeleteClick, buttonIcon: , color: "error", sx: { width: "10%", minWidth: "80px" }, }, ], [t, onPrinterClick, onDeleteClick], ); console.log("PrinterSearch render - filteredPrinters:", filteredPrinters); console.log("PrinterSearch render - printers prop:", printers); return ( <> { setFilteredPrinters(printers); setPagingController({ pageNum: 1, pageSize: pagingController.pageSize }); }} onSearch={async (query) => { setIsSearching(true); try { let results: PrinterResult[] = printers; if (query.name && query.name.trim()) { results = results.filter((printer) => printer.name?.toLowerCase().includes(query.name?.toLowerCase() || "") ); } if (query.ip && query.ip.trim()) { results = results.filter((printer) => printer.ip?.toLowerCase().includes(query.ip?.toLowerCase() || "") ); } if (query.type && query.type.trim()) { results = results.filter((printer) => printer.type?.toLowerCase().includes(query.type?.toLowerCase() || "") ); } setFilteredPrinters(results); setPagingController({ pageNum: 1, pageSize: pagingController.pageSize }); } catch (error) { console.error("Error searching printers:", error); setFilteredPrinters(printers); } finally { setIsSearching(false); } }} /> items={filteredPrinters} columns={columns} pagingController={pagingController} setPagingController={setPagingController} /> ); }; export default PrinterSearch;