"use client"; import { ColumnDef } from "@tanstack/react-table"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Button } from "@/components/ui/button"; import { Check, MoreHorizontal, Trash2, X } from "lucide-react"; import { ReloadIcon } from "@radix-ui/react-icons"; import { StatusBadge } from "@/components/common/status-badge"; import {Restoration, RestorationWith} from "@/db/schema/07_database"; import { formatLocalizedDate } from "@/utils/date-formatting"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { deleteRestoreAction, rerunRestorationAction, } from "@/features/database/restore.action"; import { toast } from "sonner"; import { TooltipCustom } from "@/components/common/tooltip-custom"; import { MemberWithUser } from "@/db/schema/03_organization"; import { ButtonWithConfirm } from "@/components/common/button-with-confirm"; import {LogsModalTrigger} from "@/features/logs/logs-modal-trigger"; import {formatDuration} from "@/utils/text"; export function restoreColumns( isAlreadyRestore: boolean, activeMember: MemberWithUser, ): ColumnDef[] { return [ { accessorKey: "id", header: "Reference", }, { accessorKey: "createdAt", header: "Created At", cell: ({ row }) => { return formatLocalizedDate(row.getValue("createdAt")); }, }, { accessorKey: "status", header: "Status", cell: ({ row }) => { return ; }, }, { accessorKey: "durationMs", header: "Duration", cell: ({row}) => { const durationMs = row.getValue("durationMs"); return durationMs ? formatDuration(row.getValue("durationMs")) : "-" }, }, { accessorKey: "logs", header: "Logs", cell: ({row}) => { const logs = row.original.logs ?? []; return ; }, }, { id: "actions", cell: ({ row }) => { const status = row.getValue("status"); const queryClient = useQueryClient(); const rowData: Restoration = row.original; const mutationDeleteRestore = useMutation({ mutationFn: async () => { const restoration = await deleteRestoreAction({ restorationId: rowData.id, }); // @ts-ignore if (restoration.data.success) { // @ts-ignore toast.success(restoration.data.actionSuccess.message); queryClient.invalidateQueries({ queryKey: ["database-data", rowData.databaseId], }); } else { // @ts-ignore toast.error(restoration.data.actionError.message); } }, }); const mutationRerunRestore = useMutation({ mutationFn: async () => { const restoration = await rerunRestorationAction({ restorationId: rowData.id, }); // @ts-ignore if (restoration.data.success) { // @ts-ignore toast.success(restoration.data.actionSuccess.message); queryClient.invalidateQueries({ queryKey: ["database-data", rowData.databaseId], }); } else { // @ts-ignore toast.error(restoration.data.actionError.message); } }, }); const handleDelete = async () => { await mutationDeleteRestore.mutateAsync(); }; const handleRerunRestore = async () => { await mutationRerunRestore.mutateAsync(); }; return ( <> {activeMember.role !== "member" && ( Actions {rowData.backupStorageId && ( { await handleRerunRestore(); }} > Rerun )} ), disabled: status === "waiting", className: "text-red-500 hover:text-red-500 p-0 h-auto has-[>svg]:px-0", }, confirm: { className: "w-full", text: "Yes, delete", icon: , variant: "destructive", onClick: async () => { await handleDelete(); }, }, cancel: { className: "w-full", text: "No, cancel", icon: , variant: "outline", }, }} isPending={mutationDeleteRestore.isPending} /> )} ); }, }, ]; }