import Button from "@/components/Low/Button"; import { useEffect, useMemo, useState } from "react"; import { BsChevronDoubleLeft, BsChevronDoubleRight, BsChevronLeft, BsChevronRight, } from "react-icons/bs"; import Select from "../components/Low/Select"; export default function usePagination(list: T[], size = 25) { const [page, setPage] = useState(0); const [itemsPerPage, setItemsPerPage] = useState(size); const items = useMemo( () => list.slice(page * itemsPerPage, (page + 1) * itemsPerPage), [list, page, itemsPerPage] ); useEffect(() => { if (page * itemsPerPage >= list.length) setPage(0); }, [items, itemsPerPage, list.length, page]); const itemsPerPageOptions = [25, 50, 100, 200]; const render = () => (
setItemsPerPage(parseInt(value!.value ?? "25"))} options={itemsPerPageOptions.map((size) => ({ label: size.toString(), value: size.toString(), }))} isClearable={false} styles={{ control: (styles) => ({ ...styles, width: "100px" }), container: (styles) => ({ ...styles, width: "100px" }), }} /> {page * itemsPerPage + 1} -{" "} {itemsPerPage * (page + 1) > list.length ? list.length : itemsPerPage * (page + 1)} / {list.length}
); return { page, items, setPage, render, renderMinimal }; }