import { swrFetcher } from "@/api/api"; import { Checkbox } from "@/components/ui/checkbox"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import useSWR from "swr"; import { useEffect, useMemo } from "react"; import { ActionButtonGroup } from "@/components/action-button-group"; import { HeaderButtonGroup } from "@/components/header-button-group"; import { toast } from "sonner"; import { ModelWAFApiMock, wafBlockReasons } from "@/types"; import { deleteWAF } from "@/api/waf"; import { ip16Str } from "@/lib/utils"; import { SettingsTab } from "@/components/settings-tab"; import { useTranslation } from "react-i18next"; export default function WAFPage() { const { t } = useTranslation(); const { data, mutate, error, isLoading } = useSWR("/api/v1/waf", swrFetcher); useEffect(() => { if (error) toast(t("Error"), { description: t(`Error fetching resource: ${error.message}.`), }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [error]); const columns: ColumnDef[] = [ { id: "select", header: ({ table }) => ( table.toggleAllPageRowsSelected(!!value)} aria-label="Select all" /> ), cell: ({ row }) => ( row.toggleSelected(!!value)} aria-label="Select row" /> ), enableSorting: false, enableHiding: false, }, { header: "IP", accessorKey: "ip", accessorFn: (row) => ip16Str(row.ip ?? ""), }, { header: t("Count"), accessorKey: "count", accessorFn: (row) => row.count, }, { header: t("LastBlockReason"), accessorKey: "lastBlockReason", accessorFn: (row) => row.last_block_reason, cell: ({ row }) => {wafBlockReasons[row.original.last_block_reason] || ""}, }, { header: t("LastBlockTime"), accessorKey: "lastBlockTime", accessorFn: (row) => row.last_block_timestamp, cell: ({ row }) => { const s = row.original; const date = new Date((s.last_block_timestamp || 0)*1000); return {date.toISOString()}; }, }, { id: "actions", header: "Actions", cell: ({ row }) => { const s = row.original; return ( <> ); }, }, ]; const dataCache = useMemo(() => { return data ?? []; }, [data]); const table = useReactTable({ data: dataCache, columns, getCoreRowModel: getCoreRowModel(), }); const selectedRows = table.getSelectedRowModel().rows; return (
ip16Str(r.original.ip ?? "")), mutate: mutate, }} > <>
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ); })} ))} {isLoading ? ( {t("Loading")}... ) : table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( {t("NoResults")} )}
); }