usePagination

Hook:

import { useState, useMemo } from "react";

const usePagination = ({ items, pageSize, currentPage }) => {
  const [page, setPage] = useState(currentPage);

  const totalPages = useMemo(() => {
    return Math.ceil(items.length / pageSize);
  }, [items.length, pageSize]);

  const startIndex = (page - 1) * pageSize;
  const endIndex = startIndex + pageSize;
  const itemsToShow = useMemo(() => {
    return items.slice(startIndex, endIndex);
  }, [items, startIndex, endIndex]);

  const goToPage = (pageNumber) => {
    if (pageNumber < 1 || pageNumber > totalPages) {
      return;
    }
    setPage(pageNumber);
  };

  return { itemsToShow, totalPages, goToPage };
};

export default usePagination;

How to use:

import React, { useState } from "react";
import usePagination from "./usePagination";

const items = Array.from({ length: 50 }, (_, i) => `Item ${i + 1}`);

const Example = () => {
  const [page, setPage] = useState(1);
  const { itemsToShow, totalPages, goToPage } = usePagination({
    items,
    pageSize: 10,
    currentPage: page,
  });

  return (
    <div>
      <ul>
        {itemsToShow.map((item) => (
          <li key={item}>{item}</li>
        ))}
      </ul>
      <p>
        Showing page {page} of {totalPages}
      </p>
      <button onClick={() => goToPage(page - 1)}>Prev</button>
      <button onClick={() => goToPage(page + 1)}>Next</button>
    </div>
  );
};

export default Example;