import React from 'react'; import { usePagination, UsePaginationProps, UsePaginationItem } from '@material-ui/lab/Pagination'; import { CircleButton } from '../Button'; import classNames from 'classnames'; interface PaginationProps extends React.HTMLAttributes, UsePaginationProps { first?: React.ReactNode; last?: React.ReactNode; prev?: React.ReactNode; next?: React.ReactNode; onChange?: () => void; count?: number; perScreen?: number; } const generateEdgeComponent = ( item: UsePaginationItem, first: React.ReactNode, last: React.ReactNode, prev: React.ReactNode, next: React.ReactNode, ): React.ReactNode => { const { type, ...rest } = item; if (['start-ellipsis', 'end-ellipsis'].includes(type)) { return '…'; } let node: React.ReactNode = ''; let className: string = ''; if (type === 'first') { node = first || type; className = 'mr-2'; } else if (type === 'last') { node = last || type; className = 'ml-2'; } else if (type === 'next') { node = next; className = 'ml-2'; } else if (type === 'previous') { node = prev; className = 'mr-2'; } return ( ); }; const generatePageComponent = (item: UsePaginationItem): React.ReactNode => { const { selected, page, onClick, disabled } = item; return ( {page} ); }; export const Pagination: React.FC = (props) => { const { first, last, className, prev = 'Previous', next = 'Next', count = 1, page = 1, ...rest } = props; const { items } = usePagination({ count, showFirstButton: !!first, showLastButton: !!last, siblingCount: Infinity, defaultPage: page, ...rest, }); return (
    {items.map((item, index) => { const { type } = item; if (type === 'page') { return
  • {generatePageComponent(item)}
  • ; } return
  • {generateEdgeComponent(item, first, last, prev, next)}
  • ; })}
); }; export default Pagination;