import {ChevronLeftIcon, ChevronRightIcon} from '@heroicons/react/24/solid' import clsx from 'clsx' import {range} from 'lodash' import {usePathname, useRouter} from 'next/navigation' import {useEffect} from 'react' import {buttonClass} from 'web/components/buttons/button' import {LoadingIndicator} from 'web/components/widgets/loading-indicator' import {useDefinedSearchParams} from 'web/hooks/use-defined-search-params' import {Row} from '../layout/row' import {Spacer} from '../layout/spacer' export const PAGE_ELLIPSES = '...' export function PaginationNextPrev(props: { className?: string isStart: boolean isEnd: boolean isLoading: boolean isComplete: boolean getPrev: () => void getNext: () => void }) { const {className, isStart, isEnd, isLoading, isComplete, getPrev, getNext} = props return ( ) } export function Pagination(props: { page: number pageSize: number totalItems: number setPage: (page: number) => void className?: string savePageToQuery?: boolean }) { const {page, pageSize, totalItems, setPage, className, savePageToQuery} = props const router = useRouter() const {searchParams, createQueryString} = useDefinedSearchParams() const pathname = usePathname() useEffect(() => { if (!savePageToQuery) return const p = searchParams.get('p') if (p && page !== parseInt(p as string)) { setPage(parseInt(p as string)) } else if (!p && page !== 0) { setPage(0) } }, [searchParams]) const onClick = (page: number) => { if (savePageToQuery) { router.push(pathname + '?' + createQueryString('p', page.toString())) } else setPage(page) } const maxPage = Math.ceil(totalItems / pageSize) - 1 if (maxPage <= 0) return const pageNumbers = getPageNumbers(maxPage, page) return ( ) } export function PaginationArrow(props: { onClick: () => void disabled: boolean nextOrPrev: 'next' | 'prev' }) { const {onClick, disabled, nextOrPrev} = props return (
{nextOrPrev === 'prev' && } {nextOrPrev === 'next' && }
) } export function PageNumbers(props: { pageNumber: PageNumbers setPage: (page: number) => void page: number }) { const {pageNumber, setPage, page} = props if (pageNumber === PAGE_ELLIPSES || typeof pageNumber === 'string') { return
{PAGE_ELLIPSES}
} return ( ) } type PageNumbers = number | string function getPageNumbers(maxPage: number, page: number): Array { if (maxPage <= 7) { return range(0, maxPage + 1) } if (page < 4) { return Array.from({length: 5}, (_, index) => index).concat([ PAGE_ELLIPSES, maxPage, ]) } if (page >= maxPage - 3) { return [0, PAGE_ELLIPSES].concat( Array.from({length: 5}, (_, index) => index + maxPage - 4), ) } return [0, PAGE_ELLIPSES, page - 1, page, page + 1, PAGE_ELLIPSES, maxPage] }