"use client"; import React from "react"; import { Button } from "@/components/ui/button"; import { PaginationBaseProps } from "./types"; /** * Calculate the page numbers to display in pagination * @param currentPage Current active page * @param totalPages Total number of pages * @param maxButtons Maximum number of page buttons to show (default: 5) * @returns Array of page numbers to display */ const getPageNumbers = (currentPage: number, totalPages: number, maxButtons: number = 5): number[] => { const pageNumbers: number[] = []; // If we have fewer pages than the maximum buttons, show all pages if (totalPages <= maxButtons) { for (let i = 1; i <= totalPages; i++) { pageNumbers.push(i); } } // If we're near the beginning, show first maxButtons pages else if (currentPage <= 3) { for (let i = 1; i <= maxButtons; i++) { pageNumbers.push(i); } } // If we're near the end, show last maxButtons pages else if (currentPage >= totalPages - 2) { for (let i = totalPages - maxButtons + 1; i <= totalPages; i++) { pageNumbers.push(i); } } // Otherwise, show pages centered around current page else { for (let i = currentPage - 2; i <= currentPage + 2; i++) { pageNumbers.push(i); } } return pageNumbers; }; export const PageNavigation: React.FC = ({ pagination, updatePagination, loading = false, lang, translations, }) => { const t = translations[lang] || {}; const handlePageChange = (newPage: number) => { if (newPage >= 1 && newPage <= pagination.totalPages) { updatePagination({ page: newPage }); } }; // Get the page numbers to display const pageNumbers = getPageNumbers(pagination.page, pagination.totalPages); return (
{pagination.back ? ( ) : ( )} {/* Page number buttons */}
{pageNumbers.map((pageNum) => ( ))}
{pagination.page < pagination.totalPages ? ( ) : ( )} {/* Page text display */} {t.page || "Page"} {pagination.page} {t.of || "of"} {pagination.totalPages}
); };