/** * Компонент пагинации */ 'use client'; import { useUrlParams } from '@/hooks/useUrlParams'; interface PaginationProps { total: number; limit: number; currentPage: number; onPageChange?: (page: number) => void; } export default function Pagination({ total, limit, currentPage, onPageChange, }: PaginationProps) { const { setPage } = useUrlParams(); const totalPages = Math.ceil(total / limit); const handlePageChange = (page: number) => { if (page >= 1 && page <= totalPages) { setPage(page); onPageChange?.(page); } }; if (totalPages <= 1) { return null; } const getPageNumbers = () => { const pages: (number | string)[] = []; const maxVisible = 7; if (totalPages <= maxVisible) { for (let i = 1; i <= totalPages; i++) { pages.push(i); } } else { if (currentPage <= 3) { for (let i = 1; i <= 5; i++) { pages.push(i); } pages.push('...'); pages.push(totalPages); } else if (currentPage >= totalPages - 2) { pages.push(1); pages.push('...'); for (let i = totalPages - 4; i <= totalPages; i++) { pages.push(i); } } else { pages.push(1); pages.push('...'); for (let i = currentPage - 1; i <= currentPage + 1; i++) { pages.push(i); } pages.push('...'); pages.push(totalPages); } } return pages; }; return (
Показано {((currentPage - 1) * limit) + 1} - {Math.min(currentPage * limit, total)} из {total}
{getPageNumbers().map((page, index) => { if (page === '...') { return ( ... ); } const pageNum = page as number; const isActive = pageNum === currentPage; return ( ); })}
); }