import { Link } from "@inertiajs/react";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { cn } from "@/lib/utils";
interface PaginationProps {
links: {
url: string | null;
label: string;
active: boolean;
}[];
className?: string;
}
export default function Pagination({ links, className }: PaginationProps) {
// 如果只有一頁,不顯示分頁
if (links.length <= 3) return null;
return (
{links.map((link, key) => {
// 處理特殊標籤
let label = link.label;
if (label.includes("«")) label = "Previous";
if (label.includes("»")) label = "Next";
const isPrevious = label === "Previous";
const isNext = label === "Next";
const activeIndex = links.findIndex(l => l.active);
// Responsive visibility logic:
// Global: Previous, Next, Active are always visible
// Mobile (< sm): Active, +-1, First, Last, and Ellipses
// Tablet (sm < md): Active, +-2, First, Last, and Ellipses
// Desktop (>= md): All standard pages
const isFirst = key === 1;
const isLast = key === links.length - 2;
const isEllipsis = !isPrevious && !isNext && !link.url;
const isMobileVisible =
isPrevious ||
isNext ||
link.active ||
isFirst ||
isLast ||
isEllipsis ||
key === activeIndex - 1 ||
key === activeIndex + 1;
const isTabletVisible =
isMobileVisible ||
key === activeIndex - 2 ||
key === activeIndex + 2;
const baseClasses = cn(
"h-9 items-center justify-center rounded-md border px-3 text-sm",
isMobileVisible ? "flex" : (isTabletVisible ? "hidden sm:flex md:flex" : "hidden md:flex")
);
// 如果是 Previous/Next 但沒有 URL,則不渲染(或者渲染為 disabled)
if ((isPrevious || isNext) && !link.url) {
return (
{isPrevious && }
{isNext && }
{!isPrevious && !isNext && }
);
}
return link.url ? (
{isPrevious &&
}
{isNext &&
}
{!isPrevious && !isNext &&
}
) : (
);
})}
);
}