Spaces:
Sleeping
Sleeping
import React from 'react'; | |
type PaginationProps = { | |
currentPage: number; | |
totalPages: number; | |
onPageChange: (page: number) => void; | |
}; | |
export default function Pagination({ currentPage, totalPages, onPageChange }: PaginationProps) { | |
return ( | |
<div className="mt-4 flex items-center justify-between"> | |
<button | |
onClick={() => onPageChange(Math.max(currentPage - 1, 1))} | |
disabled={currentPage === 1} | |
className={`px-4 py-2 rounded-md mr-2 ${ | |
currentPage === 1 | |
? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-500 cursor-not-allowed' | |
: 'bg-blue-500 dark:bg-blue-600 text-white' | |
}`} | |
> | |
< | |
</button> | |
<div className="flex items-center space-x-2"> | |
{currentPage > 1 && ( | |
<> | |
<button | |
onClick={() => onPageChange(1)} | |
className="px-2 py-1 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md" | |
> | |
1 | |
</button> | |
{currentPage > 2 && <span className="text-gray-500">...</span>} | |
</> | |
)} | |
{[...Array(5)].map((_, i) => { | |
const page = currentPage + i - 2; | |
if (page >= 1 && page <= totalPages) { | |
return ( | |
<button | |
key={page} | |
onClick={() => onPageChange(page)} | |
className={`px-2 py-1 rounded-md ${ | |
page === currentPage | |
? 'bg-blue-500 dark:bg-blue-600 text-white' | |
: 'bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200' | |
}`} | |
> | |
{page} | |
</button> | |
); | |
} | |
return null; | |
})} | |
{currentPage < totalPages && ( | |
<> | |
{currentPage < totalPages - 1 && <span className="text-gray-500">...</span>} | |
<button | |
onClick={() => onPageChange(totalPages)} | |
className="px-2 py-1 bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-200 rounded-md" | |
> | |
{totalPages} | |
</button> | |
</> | |
)} | |
</div> | |
<button | |
onClick={() => onPageChange(Math.min(currentPage + 1, totalPages))} | |
disabled={currentPage === totalPages} | |
className={`px-4 py-2 rounded-md ${ | |
currentPage === totalPages | |
? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-500 cursor-not-allowed' | |
: 'bg-blue-500 dark:bg-blue-600 text-white' | |
}`} | |
> | |
> | |
</button> | |
</div> | |
); | |
} | |