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]
}