import React from "react"; import { PaginationBall } from "./ball"; import ArrowIcon from "../../icons/arrow"; import { cva } from "class-variance-authority"; const createArrayBetweenRange = (start: number, end: number) => Array.from({ length: end - start }, (_, i) => start + i); const VISIBLE_PAGES_THRESHOLD = 5; const arrowsStyles = cva(["cursor-pointer"], { variants: { show: { false: "invisible", }, }, }); interface PaginationProps { totalPages: number; currentPage: number; onCurrentPageChange: (page: number) => void; } export const Pagination = ({ totalPages, onCurrentPageChange, currentPage, }: PaginationProps) => { const firstPage = currentPage === 1; const lastPage = currentPage === totalPages; const moreThanOnePage = totalPages > 1; const hasALotOfPages = totalPages > VISIBLE_PAGES_THRESHOLD; return (
onCurrentPageChange(currentPage - 1)} className={arrowsStyles({ show: !firstPage && moreThanOnePage, className: "rotate-180", })} />
{/* first page */} {moreThanOnePage && ( onCurrentPageChange(1)} /> )} {/* middle pages */} {hasALotOfPages && ( <> {/* if first page, show next page */} {firstPage && ( onCurrentPageChange(currentPage + 1)} /> )} {totalPages / 2 > totalPages / currentPage && ( ... )} {!firstPage && !lastPage && ( onCurrentPageChange(currentPage)} /> )} {totalPages - 1 !== currentPage && !lastPage && ( ... )} {/* if last page, show before page */} {lastPage && ( onCurrentPageChange(currentPage - 1)} /> )} )} {moreThanOnePage && !hasALotOfPages && createArrayBetweenRange(2, totalPages).map((number) => ( onCurrentPageChange(number)} number={number} /> ))} {/* last page */} {moreThanOnePage && ( onCurrentPageChange(totalPages)} /> )}
onCurrentPageChange(currentPage + 1)} />
); };