import React, { ReactElement, useMemo, useState } from "react"; import PropTypes from "prop-types"; import { ColumnDef, flexRender, getCoreRowModel, getFilteredRowModel, useReactTable, PaginationState, } from "@tanstack/react-table"; export const T2Table = (tableOptions): 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

{/* Prev/Next buttons */}
{table.getHeaderGroups().map((headerGroup, idx) => ( {headerGroup.headers.map((header, idx) => ( ))} ))} {table.getRowModel().rows.map((row, idx) => { return ( rowClickHandler(row)}> {row.getVisibleCells().map((cell) => { return ( ); })} ); })}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext(), )}
{flexRender( cell.column.columnDef.cell, cell.getContext(), )}
); }; T2Table.propTypes = { sourceData: PropTypes.array, totalPages: PropTypes.number, columns: PropTypes.array, paginationHandlers: PropTypes.shape({ nextPage: PropTypes.func, previousPage: PropTypes.func, }), rowClickHandler: PropTypes.func, children: PropTypes.any, }; export default T2Table;