'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 };
}