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 && } ) : (
); })}
); }