import type { ColumnDef } from "@tanstack/react-table"; import { EllipsisVertical, Trash2, Wrench } from "lucide-react"; import { DataTable } from "~/components/custom_ui/data-table"; import { DataTableColumnHeader } from "~/components/custom_ui/dataTable-header"; import type { PinnedFiltro, SearchFiltro, } from "~/components/custom_ui/dataTable-toolbar"; import { Button } from "~/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "~/components/ui/dropdown-menu"; import { formatCurrency } from "~/lib/utils"; import PaymentStatusEnum from "~/schemas/public/PaymentStatusEnum"; import type { OrdiniWPagamenti } from "~/server/controllers/ordini.controller"; import { api } from "~/utils/api"; type PaymentsTableProps = { data: OrdiniWPagamenti["pagamenti"]; isAdmin: boolean; isUserView?: boolean; }; const StatusMapping = (status: PaymentStatusEnum | null) => { switch (status) { case PaymentStatusEnum.success: return "Successo"; case PaymentStatusEnum.processing: return "In lavorazione"; case PaymentStatusEnum.failed: return "Errore"; default: return "Non completato"; } }; const EnumFromString = (value: string) => { switch (value) { case "Successo": return PaymentStatusEnum.success; case "In lavorazione": return PaymentStatusEnum.processing; case "Errore": return PaymentStatusEnum.failed; default: return null; } }; export const PaymentsTable = ({ data, isAdmin, isUserView = false, }: PaymentsTableProps) => { const tabledata = data.map((row) => { return { actions: "Azioni", amount: row.amount_cent, id: row.id, paid_at: row.paid_at, raw_status: row.paymentstatus, status: StatusMapping(row.paymentstatus), intent_id: row.intent_id, }; }); const columns_titles = { actions: "Azioni", amount: "Importo", paid_at: "Pagato il", status: "Stato", username: "Utente", }; const status_options = [ { label: "Inutilizzato", value: "Inutilizzato" }, { label: "Successo", value: "Successo" }, { label: "In lavorazione", value: "In lavorazione" }, { label: "Errore", value: "Errore" }, ]; const utils = api.useUtils(); const { mutate: update } = api.servizio.updatePagamento.useMutation({ onSuccess: async () => { await utils.servizio.getAllPagamenti.invalidate(); await utils.servizio.getOrdini.invalidate(); await utils.servizio.getOrdineById.invalidate({ ordineId: data[0]?.ordine_id, }); if ((!isAdmin || isUserView) && data[0]) { await utils.servizio.getUserPagamenti.invalidate({ userId: data[0].userid, }); } }, }); const { mutate: remove } = api.servizio.removePagamento.useMutation({ onSuccess: async () => { await utils.servizio.getAllPagamenti.invalidate(); await utils.servizio.getOrdini.invalidate(); await utils.servizio.getOrdineById.invalidate({ ordineId: data[0]?.ordine_id, }); if ((!isAdmin || isUserView) && data[0]) { await utils.servizio.getUserPagamenti.invalidate({ userId: data[0].userid, }); } }, }); type Column = (typeof tabledata)[number]; const columns: ColumnDef[] = [ { accessorKey: "paid_at", cell: ({ row }) => { const date = row.getValue("paid_at"); return new Date(date as Date).toLocaleDateString(); }, enableHiding: false, header: ({ column }) => ( ), sortingFn: "datetime", }, { accessorKey: "status", filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, header: ({ column }) => ( ), }, { accessorKey: "amount", cell: ({ row }) => { return {formatCurrency(row.original.amount / 100)}; }, header: ({ column }) => ( ), }, { cell: ({ row }) => { const data = row.original; if (!isAdmin) return null; return ( Azioni Aggiorna status { update({ data: { paymentstatus: EnumFromString(v) }, pagamentoId: data.id, }); }} value={StatusMapping(data.raw_status)} > Inutilizzato Successo In lavorazione Errore confirm("Sei sicuro di voler eliminare il servizio?") && remove({ pagamentoId: data.id }) } > Elimina Pagamento ); }, enableHiding: false, id: "actions", }, ]; const searchFiltro: SearchFiltro | undefined = isAdmin && !isUserView ? { columnName: "username", placeholder: "Cerca utente...", } : undefined; const pinnedFiltri: PinnedFiltro[] = [ { columnName: "status", options: status_options, title: "Status", }, ]; return (
); };