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)}
/>
);
};