import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
import { cn } from "~/lib/utils";
const PAGE_SIZE_OPTIONS = [10, 15, 20, 50, 100];
type PaginationProps = {
page: number;
pageSize: number;
total: number;
onPageChange: (page: number) => void;
onPageSizeChange?: (size: number) => void;
className?: string;
};
export function Pagination({ page, pageSize, total, onPageChange, onPageSizeChange, className }: PaginationProps) {
const totalPages = Math.max(1, Math.ceil(total / pageSize));
const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
const to = Math.min(page * pageSize, total);
const isFirst = page <= 1;
const isLast = page >= totalPages;
// 生成页码列表(最多显示 7 个按钮)
function buildPages(): (number | "...")[] {
if (totalPages <= 7) {
return Array.from({ length: totalPages }, (_, i) => i + 1);
}
if (page <= 4) {
return [1, 2, 3, 4, 5, "...", totalPages];
}
if (page >= totalPages - 3) {
return [1, "...", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages];
}
return [1, "...", page - 1, page, page + 1, "...", totalPages];
}
const pages = buildPages();
return (
{/* 左侧:总数 + 每页显示 */}
共 {total} 条 · 第{" "}
{from}
{" 至 "}
{to} 条
{/* 每页条数 */}
{onPageSizeChange && (
每页
)}
{/* 右侧:页码导航 */}
{/* 首页 */}
onPageChange(1)} disabled={isFirst} title="第一页">
{/* 上一页 */}
onPageChange(page - 1)} disabled={isFirst} title="上一页">
{/* 页码按钮 */}
{pages.map((p, i) =>
p === "..." ? (
···
) : (
),
)}
{/* 下一页 */}
onPageChange(page + 1)} disabled={isLast} title="下一页">
{/* 末页 */}
onPageChange(totalPages)} disabled={isLast} title="最后一页">
);
}
function NavBtn({
children,
onClick,
disabled,
title,
}: {
children: React.ReactNode;
onClick: () => void;
disabled: boolean;
title?: string;
}) {
return (
);
}