83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
|
import React from 'react';
|
|||
|
import Image from "next/image";
|
|||
|
|
|||
|
interface PaginationProps {
|
|||
|
totalItems: number;
|
|||
|
itemsPerPage: number;
|
|||
|
currentPage: number;
|
|||
|
onPageChange: (page: number) => void;
|
|||
|
}
|
|||
|
|
|||
|
const Pagination: React.FC<PaginationProps> = ({
|
|||
|
totalItems,
|
|||
|
itemsPerPage,
|
|||
|
currentPage,
|
|||
|
onPageChange,
|
|||
|
}) => {
|
|||
|
const totalPages = Math.ceil(totalItems / itemsPerPage);
|
|||
|
|
|||
|
const getPaginationArray = () => {
|
|||
|
const pages: (number | string)[] = [];
|
|||
|
|
|||
|
if (totalPages <= 5) {
|
|||
|
for (let i = 1; i <= totalPages; i++) {
|
|||
|
pages.push(i);
|
|||
|
}
|
|||
|
} else {
|
|||
|
pages.push(1);
|
|||
|
|
|||
|
if (currentPage > 3) {
|
|||
|
pages.push('...');
|
|||
|
}
|
|||
|
|
|||
|
for (let i = Math.max(2, currentPage - 1); i <= Math.min(currentPage + 1, totalPages - 1); i++) {
|
|||
|
pages.push(i);
|
|||
|
}
|
|||
|
|
|||
|
if (currentPage < totalPages - 2) {
|
|||
|
pages.push('...');
|
|||
|
}
|
|||
|
|
|||
|
pages.push(totalPages);
|
|||
|
}
|
|||
|
|
|||
|
return pages;
|
|||
|
};
|
|||
|
|
|||
|
const handlePageChange = (page: number) => {
|
|||
|
if (page !== currentPage) {
|
|||
|
onPageChange(page);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
const paginationArray = getPaginationArray();
|
|||
|
|
|||
|
return (
|
|||
|
<div className="flex">
|
|||
|
<button className="mr-[30px]" onClick={() => handlePageChange(currentPage - 1)} disabled={currentPage === 1}>
|
|||
|
<Image className="rotate-[90deg] relative top-[-2px]" src="/images/chevronDown.svg" alt="arrow" width={11} height={11} />
|
|||
|
</button>
|
|||
|
<div className="flex gap-[12px] items-center">
|
|||
|
{paginationArray.map((page, index) => (
|
|||
|
typeof page === 'number' ? (
|
|||
|
<button
|
|||
|
key={index}
|
|||
|
onClick={() => handlePageChange(page)}
|
|||
|
className={currentPage === page ? 'text-blue font-[700] text-[17px]' : 'text-[17px]'}
|
|||
|
>
|
|||
|
{page}
|
|||
|
</button>
|
|||
|
) : (
|
|||
|
<span key={index}>{page}</span> // Отображаем многоточие
|
|||
|
)
|
|||
|
))}
|
|||
|
</div>
|
|||
|
<button className="flex items-center text-[15px] font-[400] ml-[26px] gap-[11px]" onClick={() => handlePageChange(currentPage + 1)} disabled={currentPage === totalPages}>
|
|||
|
Следующая страница
|
|||
|
<Image className="rotate-[-90deg] relative top-[-2px]" src="/images/chevronDown.svg" alt="arrow" width={11} height={11} />
|
|||
|
</button>
|
|||
|
</div>
|
|||
|
);
|
|||
|
};
|
|||
|
|
|||
|
export default Pagination;
|