import { useMemo } from 'react'; import { Button } from '@/components/ui/button'; import { cn } from '@/lib/utils'; import { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react'; export interface PaginationProps { currentPage: number; totalPages: number; onPageChange: (page: number) => void; maxVisiblePages?: number; showFirstLast?: boolean; className?: string; } /** * Composant Pagination pour navigation entre pages de résultats. */ export function Pagination({ currentPage, totalPages, onPageChange, maxVisiblePages = 5, showFirstLast = false, className, }: PaginationProps) { const visiblePages = useMemo(() => { if (totalPages <= maxVisiblePages) { return Array.from({ length: totalPages }, (_, i) => i + 1); } const pages: (number | 'ellipsis-start' | 'ellipsis-end')[] = []; const half = Math.floor(maxVisiblePages / 2); let start = Math.max(1, currentPage - half); const end = Math.min(totalPages, start + maxVisiblePages - 1); // Ajuster si on est proche de la fin if (end === totalPages) { start = Math.max(1, totalPages - maxVisiblePages + 1); } // Première page if (showFirstLast && start > 1) { pages.push(1); if (start > 2) { pages.push('ellipsis-start'); } } else if (start > 1) { pages.push(1); if (start > 2) { pages.push('ellipsis-start'); } } // Pages visibles for (let i = start; i <= end; i++) { pages.push(i); } // Dernière page if (end < totalPages) { if (end < totalPages - 1) { pages.push('ellipsis-end'); } pages.push(totalPages); } return pages; }, [currentPage, totalPages, maxVisiblePages, showFirstLast]); const handlePrevious = () => { if (currentPage > 1) { onPageChange(currentPage - 1); } }; const handleNext = () => { if (currentPage < totalPages) { onPageChange(currentPage + 1); } }; const handleFirst = () => { onPageChange(1); }; const handleLast = () => { onPageChange(totalPages); }; if (totalPages <= 1) { return null; } return ( ); }