mirror of
https://github.com/langgenius/dify.git
synced 2026-09-03 15:27:49 +08:00
Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: jyong <718720800@qq.com> Co-authored-by: Yansong Zhang <916125788@qq.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: hj24 <mambahj24@gmail.com> Co-authored-by: hj24 <huangjian@dify.ai> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Co-authored-by: CodingOnStar <hanxujiang@dify.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Ayush Baluni <73417844+aayushbaluni@users.noreply.github.com> Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com> Co-authored-by: jimcody1995 <jjimcody@gmail.com> Co-authored-by: James <63717587+jamesrayammons@users.noreply.github.com> Co-authored-by: Yunlu Wen <yunlu.wen@dify.ai> Co-authored-by: Stephen Zhou <hi@hyoban.cc> Co-authored-by: Coding On Star <447357187@qq.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: jerryzai <jerryzh8710@protonmail.com> Co-authored-by: NVIDIAN <speedy.hpc@hotmail.com> Co-authored-by: ai-hpc <ai-hpc@users.noreply.github.com> Co-authored-by: Asuka Minato <i@asukaminato.eu.org> Co-authored-by: Junghwan <70629228+shaun0927@users.noreply.github.com> Co-authored-by: HeYinKazune <70251095+HeYin-OS@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: yyh <yuanyouhuilyz@gmail.com> Co-authored-by: Jingyi <jingyi.qi@dify.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: sxxtony <166789813+sxxtony@users.noreply.github.com>
95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
import type { IPaginationProps, IUsePagination } from './type'
|
|
import * as React from 'react'
|
|
import { useCallback } from 'react'
|
|
|
|
const usePagination = ({
|
|
currentPage,
|
|
setCurrentPage,
|
|
truncableText = '...',
|
|
truncableClassName = '',
|
|
totalPages,
|
|
edgePageCount,
|
|
middlePagesSiblingCount,
|
|
}: IPaginationProps): IUsePagination => {
|
|
const pages = React.useMemo(() => Array.from({ length: totalPages }, (_, i) => i + 1), [totalPages])
|
|
|
|
const hasPreviousPage = currentPage > 1
|
|
const hasNextPage = currentPage < totalPages
|
|
|
|
const isReachedToFirst = currentPage <= middlePagesSiblingCount
|
|
const isReachedToLast = currentPage + middlePagesSiblingCount >= totalPages
|
|
|
|
const middlePages = React.useMemo(() => {
|
|
const middlePageCount = middlePagesSiblingCount * 2 + 1
|
|
if (isReachedToFirst)
|
|
return pages.slice(0, middlePageCount)
|
|
|
|
if (isReachedToLast)
|
|
return pages.slice(-middlePageCount)
|
|
|
|
return pages.slice(
|
|
currentPage - middlePagesSiblingCount,
|
|
currentPage + middlePagesSiblingCount + 1,
|
|
)
|
|
}, [currentPage, isReachedToFirst, isReachedToLast, middlePagesSiblingCount, pages])
|
|
|
|
const getAllPreviousPages = useCallback(() => {
|
|
return pages.slice(0, middlePages[0]! - 1)
|
|
}, [middlePages, pages])
|
|
|
|
const previousPages = React.useMemo(() => {
|
|
if (isReachedToFirst || getAllPreviousPages().length < 1)
|
|
return []
|
|
|
|
return pages
|
|
.slice(0, edgePageCount)
|
|
.filter(p => !middlePages.includes(p))
|
|
}, [edgePageCount, getAllPreviousPages, isReachedToFirst, middlePages, pages])
|
|
|
|
const getAllNextPages = React.useMemo(() => {
|
|
return pages.slice(
|
|
middlePages[middlePages.length - 1],
|
|
pages[pages.length],
|
|
)
|
|
}, [pages, middlePages])
|
|
|
|
const nextPages = React.useMemo(() => {
|
|
if (isReachedToLast)
|
|
return []
|
|
|
|
if (getAllNextPages.length < 1)
|
|
return []
|
|
|
|
return pages
|
|
.slice(pages.length - edgePageCount, pages.length)
|
|
.filter(p => !middlePages.includes(p))
|
|
}, [edgePageCount, getAllNextPages.length, isReachedToLast, middlePages, pages])
|
|
|
|
const isPreviousTruncable = React.useMemo(() => {
|
|
// Is truncable if first value of middlePage is larger than last value of previousPages
|
|
return middlePages[0]! > previousPages[previousPages.length - 1]! + 1
|
|
}, [previousPages, middlePages])
|
|
|
|
const isNextTruncable = React.useMemo(() => {
|
|
// Is truncable if last value of middlePage is larger than first value of previousPages
|
|
return middlePages[middlePages.length - 1]! + 1 < nextPages[0]!
|
|
}, [nextPages, middlePages])
|
|
|
|
return {
|
|
currentPage,
|
|
setCurrentPage,
|
|
truncableText,
|
|
truncableClassName,
|
|
pages,
|
|
hasPreviousPage,
|
|
hasNextPage,
|
|
previousPages,
|
|
isPreviousTruncable,
|
|
middlePages,
|
|
isNextTruncable,
|
|
nextPages,
|
|
}
|
|
}
|
|
|
|
export default usePagination
|