import { keepPreviousData, useQuery } from "@tanstack/react-query"; import { ColumnFiltersState, createColumnHelper, flexRender, getCoreRowModel, PaginationState, useReactTable, } from "@tanstack/react-table"; import { useState } from "react"; import { DebounceInput } from "react-debounce-input"; const PageSize = 30; async function loader(page = 0, category: string | undefined = "") { const url = new URL("http://localhost:9000/transactions"); url.search = new URLSearchParams({ limit: String(PageSize), offset: String(page * PageSize), ...(category !== "" && { category: category }), }).toString(); return await fetch(url).then((response) => response.json()); } type Transaction = { id: number; date: string; description: string; value: number; category: string; }; const columnHelper = createColumnHelper(); const columns = [ columnHelper.accessor("date", { enableColumnFilter: false, }), columnHelper.accessor("description", { enableColumnFilter: false, }), columnHelper.accessor("value", { enableColumnFilter: false, }), columnHelper.accessor("category", {}), ]; export default function Transactions() { const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: PageSize, }); const [columnFilters, setColumnFilters] = useState([ { id: "category", value: "", }, ]); const { data, isPending, isError } = useQuery({ queryKey: ["transactions", pagination.pageIndex, columnFilters], queryFn: () => loader( pagination.pageIndex, columnFilters.find((filter) => filter.id == "category")!.value as string ), placeholderData: keepPreviousData, }); const table = useReactTable({ columns, data, getCoreRowModel: getCoreRowModel(), manualPagination: true, manualFiltering: true, // rowCount: , // TODO: get this from the server pageCount: -1, onPaginationChange: setPagination, onColumnFiltersChange: setColumnFilters, state: { pagination, columnFilters, }, }); if (isPending) { return
Loading...
; } if (isError) { return
Error loading transactions
; } return ( <> {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))}
{header.isPlaceholder ? null : ( <> {flexRender( header.column.columnDef.header, header.getContext() )} {header.column.getCanFilter() ? (
header.column.setFilterValue(e.target.value) } />
) : null} )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
Page {table.getState().pagination.pageIndex + 1}
); }