All files / src/shared/components/Paginator Paginator.tsx

100% Statements 55/55
100% Branches 7/7
100% Functions 6/6
100% Lines 55/55

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76  1x 1x 1x 1x                 1x   1x 101x   101x 101x 101x 101x 101x 101x 101x 101x   101x 101x 101x 101x 101x 101x 101x 101x   101x 101x   101x 199x 199x 199x 199x 199x 199x 199x   199x 199x 101x   101x 101x 101x 101x 101x 101x   101x 101x 101x 101x 101x 101x 101x 101x   101x 101x 101x   101x   1x  
import { FC } from 'react';
import { FaAngleLeft, FaAngleRight, FaAngleDoubleLeft, FaAngleDoubleRight } from 'react-icons/fa';
import Button, { ButtonVariant } from '../button/Button';
import { getVisiblePages } from './getVisiblePages';
import './Paginator.scss';
 
interface PaginatorProps {
  currentPage: number;
  totalPages: number;
  maxVisiblePages?: number;
  onPageChange: (page: number) => void;
}
 
const { ROUND } = ButtonVariant;
 
const Paginator: FC<PaginatorProps> = ({ currentPage, totalPages, maxVisiblePages = 5, onPageChange }) => {
  const visiblePages = getVisiblePages(currentPage, totalPages, maxVisiblePages);
 
  return (
    <div className="paginator">
      <Button
        className="paginator__nav"
        variant={ROUND}
        handleClick={() => onPageChange(1)}
        disabled={currentPage === 1}
        aria-label="First Page"
      >
        <FaAngleDoubleLeft />
      </Button>
      <Button
        variant={ROUND}
        className="paginator__nav"
        handleClick={() => onPageChange(currentPage - 1)}
        disabled={currentPage === 1}
        aria-label="Previous Page"
      >
        <FaAngleLeft />
      </Button>
 
      {visiblePages?.map((page) => (
        <Button
          key={`paginator-page-btn-${page}`}
          variant={ROUND}
          aria-label={`Page ${page}`}
          className="paginator__page"
          active={page === currentPage}
          handleClick={() => onPageChange(page)}
        >
          {page}
        </Button>
      ))}
 
      <Button
        className="paginator__nav"
        variant={ROUND}
        handleClick={() => onPageChange(currentPage + 1)}
        disabled={currentPage === totalPages}
        aria-label="Next Page"
      >
        <FaAngleRight />
      </Button>
      <Button
        className="paginator__nav"
        variant={ROUND}
        handleClick={() => onPageChange(totalPages)}
        disabled={currentPage === totalPages}
        aria-label="Last Page"
      >
        <FaAngleDoubleRight />
      </Button>
    </div>
  );
};
 
export default Paginator;