| import { Button } from "@pram/ui/components/button"; | |
| interface PaginationProps { | |
| page: number; | |
| totalPages: number; | |
| onChange: (p: number) => void; | |
| } | |
| export function Pagination({ page, totalPages, onChange }: PaginationProps) { | |
| if (totalPages <= 1) return null; | |
| const pages: (number | "...")[] = []; | |
| for (let i = 1; i <= totalPages; i++) { | |
| if (i === 1 || i === totalPages || (i >= page - 2 && i <= page + 2)) { | |
| pages.push(i); | |
| } else if (pages[pages.length - 1] !== "...") { | |
| pages.push("..."); | |
| } | |
| } | |
| return ( | |
| <div className="flex items-center justify-center gap-1 mt-6"> | |
| <Button | |
| variant="outline" | |
| size="sm" | |
| onClick={() => onChange(page - 1)} | |
| disabled={page <= 1} | |
| > | |
| Previous | |
| </Button> | |
| {pages.map((p, i) => | |
| p === "..." ? ( | |
| <span key={`e-${i}`} className="px-2 text-[var(--warm-charcoal)]"> | |
| ... | |
| </span> | |
| ) : ( | |
| <Button | |
| key={p} | |
| variant={p === page ? "default" : "outline"} | |
| size="sm" | |
| onClick={() => onChange(p as number)} | |
| > | |
| {p} | |
| </Button> | |
| ), | |
| )} | |
| <Button | |
| variant="outline" | |
| size="sm" | |
| onClick={() => onChange(page + 1)} | |
| disabled={page >= totalPages} | |
| > | |
| Next | |
| </Button> | |
| </div> | |
| ); | |
| } | |