'use client'; import React, { useMemo } from 'react'; import { ColumnDef, PaginationState, Table as TTable, Updater, flexRender, getCoreRowModel, useReactTable, } from '@tanstack/react-table'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from './table'; export type DataTableChildren = (_table: TTable) => React.ReactNode; export interface DataTableProps { columns: ColumnDef[]; data: TData[]; perPage?: number; currentPage?: number; totalPages?: number; onPaginationChange?: (_page: number, _perPage: number) => void; children?: DataTableChildren; } export function DataTable({ columns, data, perPage, currentPage, totalPages, onPaginationChange, children, }: DataTableProps) { const pagination = useMemo(() => { if (currentPage !== undefined && perPage !== undefined) { return { pageIndex: currentPage - 1, pageSize: perPage, }; } return { pageIndex: 0, pageSize: 0, }; }, [currentPage, perPage]); const manualPagination = Boolean(currentPage !== undefined && totalPages !== undefined); const onTablePaginationChange = (updater: Updater) => { if (typeof updater === 'function') { const newState = updater(pagination); onPaginationChange?.(newState.pageIndex + 1, newState.pageSize); } else { onPaginationChange?.(updater.pageIndex + 1, updater.pageSize); } }; const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), state: { pagination: manualPagination ? pagination : undefined, }, manualPagination, pageCount: totalPages, onPaginationChange: onTablePaginationChange, }); return ( <>
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ); })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( No results. )}
{children &&
{children(table)}
} ); }