import React, { ReactElement, useMemo, useState } from "react"; import { ColumnDef, flexRender, getCoreRowModel, getFilteredRowModel, useReactTable, PaginationState, } from "@tanstack/react-table"; interface T2TableProps { sourceData?: unknown[]; totalPages?: number; columns?: unknown[]; paginationHandlers?: { nextPage?(...args: unknown[]): unknown; previousPage?(...args: unknown[]): unknown; }; rowClickHandler?(...args: unknown[]): unknown; children?: any; } export const T2Table = (tableOptions: T2TableProps): ReactElement => { const { sourceData, columns, paginationHandlers: { nextPage, previousPage }, totalPages, rowClickHandler, } = tableOptions; const [{ pageIndex, pageSize }, setPagination] = useState({ pageIndex: 1, pageSize: 15, }); const pagination = useMemo( () => ({ pageIndex, pageSize, }), [pageIndex, pageSize], ); /** * Pagination control to move forward one page * @returns void */ const goToNextPage = () => { setPagination({ pageIndex: pageIndex + 1, pageSize, }); nextPage(pageIndex, pageSize); }; /** * Pagination control to move backward one page * @returns void **/ const goToPreviousPage = () => { setPagination({ pageIndex: pageIndex - 1, pageSize, }); previousPage(pageIndex, pageSize); }; const table = useReactTable({ data: sourceData, columns, manualPagination: true, getCoreRowModel: getCoreRowModel(), pageCount: sourceData.length ?? -1, state: { pagination, }, onPaginationChange: setPagination, }); return (
{/* Search bar */} {tableOptions.children} {/* Pagination controls */}
Page {pageIndex} of {Math.ceil(totalPages / pageSize)}

{totalPages} comics in all

{table.getHeaderGroups().map((headerGroup, groupIndex) => ( {headerGroup.headers.map((header, index) => ( ))} ))} {table.getRowModel().rows.map((row, rowIndex) => ( rowClickHandler(row)} className="border-b border-gray-200 dark:border-slate-700 hover:bg-slate-100/30 dark:hover:bg-slate-700/20 transition-colors cursor-pointer" > {row.getVisibleCells().map((cell) => ( ))} ))}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )}
{flexRender(cell.column.columnDef.cell, cell.getContext())}
); }; export default T2Table;