'use client'; import { useState } from 'react'; import { ChevronLeft, ChevronRight } from 'lucide-react'; const PAGE_SIZE_OPTIONS = [10, 20, 50, 100]; interface PaginationProps { total: number; page: number; pageSize: number; onChange: (page: number) => void; onPageSizeChange: (size: number) => void; } export function Pagination({ total, page, pageSize, onChange, onPageSizeChange }: PaginationProps) { const totalPages = Math.max(1, Math.ceil(total / pageSize)); if (total === 0) return null; const pages: (number | '...')[] = []; if (totalPages <= 7) { for (let i = 1; i <= totalPages; i++) pages.push(i); } else { pages.push(1); if (page > 3) pages.push('...'); const start = Math.max(2, page - 1); const end = Math.min(totalPages - 1, page + 1); for (let i = start; i <= end; i++) pages.push(i); if (page < totalPages - 2) pages.push('...'); pages.push(totalPages); } return (
共 {total} 条
{pages.map((p, idx) => p === '...' ? ( ... ) : ( ) )}
); } export function usePagination(items: T[], defaultPageSize: number = 20) { const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(defaultPageSize); const total = items.length; const totalPages = Math.max(1, Math.ceil(total / pageSize)); const safePage = Math.min(page, totalPages); const paged = items.slice((safePage - 1) * pageSize, safePage * pageSize); const handlePageSizeChange = (newSize: number) => { setPageSize(newSize); setPage(1); }; return { paged, page: safePage, setPage, total, pageSize, setPageSize: handlePageSizeChange }; }