Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 2226x 2226x 2226x 3x 3x 7x 7x 6x 1x 2226x 1054x | import { ChevronLeft, ChevronRight } from "lucide-react";
import { toast } from "sonner";
import { Button } from "./button";
import DebouncedInput from "./debounced-input";
export interface PaginatorProps {
page: number;
setPage: (page: number) => void;
data: any;
minimal?: boolean;
}
export default function Paginator({
page,
setPage,
data,
minimal,
}: PaginatorProps) {
const next = data?.next;
const previous = data?.previous;
const totalPages = data?.pages;
function handlePrevious() {
const pageNumber = new URLSearchParams(previous).get("page");
handleSetPage(pageNumber);
}
function handleNext() {
const pageNumber = new URLSearchParams(next).get("page");
handleSetPage(pageNumber);
}
function handleSetPage(value: number | string | null) {
if (value) {
if (+value <= totalPages && +value >= 1) {
setPage(+value);
} else {
toast.error("Invalid page number");
}
} else E{
setPage(1);
}
}
if (minimal && !next && !previous) return null;
return (
<div
className="flex justify-between items-center"
aria-label="paginator-main-container"
>
{!minimal && (
<p className="flex-1">
Showing {data?.results?.length} of {data?.count} results
</p>
)}
<div
className="flex gap-2 items-center"
aria-label="paginator-btn-container"
>
<Button
variant="outline"
size="icon"
onClick={handlePrevious}
disabled={!previous}
className="h-6 w-6"
>
<ChevronLeft />
</Button>
<small>
Page {page} / {totalPages}
</small>
<Button
variant="outline"
size="icon"
onClick={handleNext}
disabled={!next}
className="h-6 w-6"
>
<ChevronRight />
</Button>
</div>
{!minimal && (
<div
className="flex flex-1 justify-end gap-2 items-center"
aria-label="paginator-goto-input"
>
<p>Go to page:</p>
<div>
<DebouncedInput
value={page}
onUpdate={handleSetPage}
type="number"
className="border rounded w-16 h-7"
/>
</div>
</div>
)}
</div>
);
}
|