"use client"; import { DataTable, ExtendedColumnDef } from "@app/components/ui/data-table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@app/components/ui/dropdown-menu"; import { Button } from "@app/components/ui/button"; import { ArrowUpDown, MoreHorizontal } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import CreateSiteProvisioningKeyCredenza from "@app/components/CreateSiteProvisioningKeyCredenza"; import ConfirmDeleteDialog from "@app/components/ConfirmDeleteDialog"; import { toast } from "@app/hooks/useToast"; import { formatAxiosError } from "@app/lib/api"; import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import moment from "moment"; import { useTranslations } from "next-intl"; export type SiteProvisioningKeyRow = { id: string; key: string; name: string; createdAt: string; }; type SiteProvisioningKeysTableProps = { keys: SiteProvisioningKeyRow[]; orgId: string; }; export default function SiteProvisioningKeysTable({ keys, orgId }: SiteProvisioningKeysTableProps) { const router = useRouter(); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [selected, setSelected] = useState( null ); const [rows, setRows] = useState(keys); const api = createApiClient(useEnvContext()); const t = useTranslations(); const [isRefreshing, setIsRefreshing] = useState(false); const [createOpen, setCreateOpen] = useState(false); useEffect(() => { setRows(keys); }, [keys]); const refreshData = async () => { setIsRefreshing(true); try { await new Promise((resolve) => setTimeout(resolve, 200)); router.refresh(); } catch (error) { toast({ title: t("error"), description: t("refreshError"), variant: "destructive" }); } finally { setIsRefreshing(false); } }; const deleteKey = async (siteProvisioningKeyId: string) => { try { await api.delete( `/org/${orgId}/site-provisioning-key/${siteProvisioningKeyId}` ); router.refresh(); setIsDeleteModalOpen(false); setSelected(null); setRows((prev) => prev.filter((row) => row.id !== siteProvisioningKeyId)); } catch (e) { console.error(t("provisioningKeysErrorDelete"), e); toast({ variant: "destructive", title: t("provisioningKeysErrorDelete"), description: formatAxiosError( e, t("provisioningKeysErrorDeleteMessage") ) }); throw e; } }; const columns: ExtendedColumnDef[] = [ { accessorKey: "name", enableHiding: false, friendlyName: t("name"), header: ({ column }) => { return ( ); } }, { accessorKey: "key", friendlyName: t("key"), header: () => {t("key")}, cell: ({ row }) => { const r = row.original; return {r.key}; } }, { accessorKey: "createdAt", friendlyName: t("createdAt"), header: () => {t("createdAt")}, cell: ({ row }) => { const r = row.original; return {moment(r.createdAt).format("lll")}; } }, { id: "actions", enableHiding: false, header: () => , cell: ({ row }) => { const r = row.original; return (
{ setSelected(r); setIsDeleteModalOpen(true); }} > {t("delete")}
); } } ]; return ( <> {selected && ( { setIsDeleteModalOpen(val); if (!val) { setSelected(null); } }} dialog={

{t("provisioningKeysQuestionRemove")}

{t("provisioningKeysMessageRemove")}

} buttonText={t("provisioningKeysDeleteConfirm")} onConfirm={async () => deleteKey(selected.id)} string={selected.name} title={t("provisioningKeysDelete")} /> )} setCreateOpen(true)} onRefresh={refreshData} isRefreshing={isRefreshing} addButtonText={t("provisioningKeysAdd")} enableColumnVisibility={true} stickyLeftColumn="name" stickyRightColumn="actions" /> ); }