/**
* Компонент пагинации
*/
'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 (
);
})}
);
}