import React from "react"; import { Box, Button, Flex, Select } from "@chakra-ui/react"; import { useSearchParams } from "react-router-dom"; function PaginationToolbar({ isLoading, numTotalPages, currentPageNumber, goToPageNumber, buildPageUrl, size = "md", ...props }) { const pagesAreLoaded = currentPageNumber != null && numTotalPages != null; const hasPrevPage = pagesAreLoaded && currentPageNumber > 1; const hasNextPage = pagesAreLoaded && currentPageNumber < numTotalPages; const prevPageUrl = hasPrevPage ? buildPageUrl(currentPageNumber - 1) : null; const nextPageUrl = hasNextPage ? buildPageUrl(currentPageNumber + 1) : null; return ( goToPageNumber(currentPageNumber - 1) : undefined } _disabled={{ cursor: isLoading ? "wait" : "not-allowed", opacity: 0.4, }} isDisabled={!hasPrevPage} size={size} > ← Prev {numTotalPages > 0 && ( Page of {numTotalPages} )} goToPageNumber(currentPageNumber + 1) : undefined } _disabled={{ cursor: isLoading ? "wait" : "not-allowed", opacity: 0.4, }} isDisabled={!hasNextPage} size={size} > Next → ); } export function useRouterPagination(totalCount, numPerPage) { const [searchParams, setSearchParams] = useSearchParams(); const currentOffset = parseInt(searchParams.get("offset")) || 0; const currentPageIndex = Math.floor(currentOffset / numPerPage); const currentPageNumber = currentPageIndex + 1; const numTotalPages = totalCount ? Math.ceil(totalCount / numPerPage) : null; const buildPageUrl = React.useCallback( (newPageNumber) => { setSearchParams((newParams) => { const newPageIndex = newPageNumber - 1; const newOffset = newPageIndex * numPerPage; newParams.set("offset", newOffset); return newParams; }); }, [query, numPerPage], ); const goToPageNumber = React.useCallback( (newPageNumber) => { pushHistory(buildPageUrl(newPageNumber)); }, [buildPageUrl, pushHistory], ); return { numTotalPages, currentPageNumber, goToPageNumber, buildPageUrl, }; } function LinkOrButton({ href, ...props }) { if (href != null) { return