index.js 2.64 KB
import PropTypes from "prop-types";
import Button from "@components/base/button";
import styles from "./styles.module.css";

function Pagination({ total, currentPage, search }) {
  const totalPage = total <= 1 ? 1 : total;
  const numberOfPages = [];
  for (let i = 1; i <= totalPage; i++) {
    numberOfPages.push(i);
  }
  // Logic for displaying buttons
  let tempNumberOfPages = [];
  let dotsLeft = "...";
  let dotsRight = "...";

  if (numberOfPages.length < 6) {
    tempNumberOfPages = numberOfPages;
  } else if (currentPage >= 1 && currentPage <= 3) {
    tempNumberOfPages = [1, 2, 3, 4, dotsRight, numberOfPages.length];
  } else if (currentPage === 4) {
    const sliced = numberOfPages.slice(0, 5);
    tempNumberOfPages = [...sliced, dotsRight, numberOfPages.length];
  } else if (currentPage > 4 && currentPage < numberOfPages.length - 2) {
    const sliced1 = numberOfPages.slice(currentPage - 2, currentPage);
    const sliced2 = numberOfPages.slice(currentPage, currentPage + 1);
    tempNumberOfPages = [
      1,
      dotsLeft,
      ...sliced1,
      ...sliced2,
      dotsRight,
      numberOfPages.length,
    ];
  } else if (currentPage > numberOfPages.length - 3) {
    const sliced = numberOfPages.slice(numberOfPages.length - 4);
    tempNumberOfPages = [1, dotsLeft, ...sliced];
  }

  return (
    <div className={styles["pagination-container"]}>
      <span className={styles.previous}>
        <Button
          variant="secondary"
          disabled={currentPage <= 1}
          href={
            search
              ? `?page=${currentPage - 1}&search=${search}`
              : `?page=${currentPage - 1}`
          }
        >
          &laquo; Prev
        </Button>
      </span>
      {tempNumberOfPages.map((item, index) => (
        <span key={index}>
          <Button
            disabled={totalPage === "1"}
            variant={currentPage === item ? "primary" : "secondary"}
            href={
              item === "..."
                ? ""
                : search
                  ? `?page=${item}&search=${search}`
                  : `?page=${item}`
            }
          >
            {item}
          </Button>
        </span>
      ))}
      <span className={styles.next}>
        <Button
          variant="secondary"
          disabled={currentPage === totalPage}
          href={
            search
              ? `?page=${currentPage + 1}&search=${search}`
              : `?page=${currentPage + 1}`
          }
        >
          Next &raquo;
        </Button>
      </span>
    </div>
  );
}

Pagination.propTypes = {
  total: PropTypes.number.isRequired,
  currentPage: PropTypes.number.isRequired,
};

export default Pagination;