import { useMemo } from 'react'; import { usePagination, UsePaginationInstanceProps, UsePaginationOptions, UsePaginationState } from 'react-table'; import { pick, values } from 'lodash-es'; import { IRelatableStateInstance, PageSetter, PageSizeSetter, TableAddOnReturn } from '../relatable.types'; import { DEFAULT_PAGE_SIZE_OPTIONS } from '../constants'; export interface IWithPaginationOptions extends UsePaginationOptions { onPageChange?: PageSetter; onPageSizeChange?: PageSizeSetter; pageSizeOptions?: number[]; // react-table state overrides https://react-table.js.org/api/usePagination pageSize?: number; pageIndex?: number; } export interface IWithPaginationState extends UsePaginationState { } export interface IWithPaginationInstance extends UsePaginationInstanceProps, IRelatableStateInstance> { customPageSizeOptions: number[]; onCustomPageSizeChange?: PageSizeSetter; onCustomPageChange?: PageSetter; } export default function withPagination(options: IWithPaginationOptions = {}): TableAddOnReturn { const { pageSize, pageIndex, onPageSizeChange, onPageChange, pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, ...tableParams } = options; const stateParams = pick(options, ['pageSize', 'pageIndex']); return [ withPagination.name, null, () => false, () => useMemo((): Partial => ({ ...tableParams, customPageSizeOptions: pageSizeOptions, // @todo: figure out strategy for these onCustomPageSizeChange: onPageSizeChange, onCustomPageChange: onPageChange, }), [onPageSizeChange, onPageChange, ...values(tableParams)]), () => useMemo(() => stateParams, values(stateParams)), usePagination, ]; }