/** @jsxImportSource @emotion/react */ import { LoadingSpinner } from '@/@dble_layout'; import { colors } from '@/libs/themes'; import { Interpolation, Theme } from '@emotion/react'; import dynamic from 'next/dynamic'; import React from 'react'; interface PaginationProps { activePage: number; itemsCountPerPage: number; totalItemsCount: number; pageRangeDisplayed?: number; hideNavigation?: boolean; hideEndNavigation?: boolean; activeScrollTop?: boolean; onChange?: (pageNumber: number) => void; } const PaginationComponent: React.FC = ({ activePage = 1, itemsCountPerPage = 10, totalItemsCount, pageRangeDisplayed = 4, hideNavigation = true, hideEndNavigation = true, activeScrollTop, onChange, }) => { const totalPages = Math.ceil(totalItemsCount / itemsCountPerPage); const startPage = Math.max(1, activePage - Math.floor(pageRangeDisplayed / 2)); const endPage = Math.min(totalPages, startPage + pageRangeDisplayed - 1); const handlePageChange = (pageNumber: number) => { if (pageNumber >= 1 && pageNumber <= totalPages && pageNumber !== activePage) { onChange && onChange(pageNumber); activeScrollTop && window.scrollTo({ top: 0 }); } }; return (
{!hideEndNavigation && activePage !== 1 && ( )} {!hideNavigation && activePage !== 1 && ( )}
{Array.from({ length: endPage - startPage + 1 }, (_, idx) => startPage + idx).map(pageNumber => ( ))}
{!hideNavigation && activePage !== totalPages && ( <> )} {!hideEndNavigation && activePage !== totalPages && ( <> )}
); }; const Pagination = dynamic(() => Promise.resolve(PaginationComponent), { ssr: false, loading: () => , }); export default Pagination; const FlowIcon = ({ as, fill = '#999' }: { as?: 'prev' | 'next'; fill?: string }) => ( ); const FlowEndIcon = ({ as, fill = '#aaa' }: { as?: 'prev' | 'next'; fill?: string }) => ( ); const numberWrapTheme = { display: 'flex', alignItems: 'center', gap: 5, } as Interpolation; const numberTheme = { display: 'flex', alignItems: 'center', justifyContent: 'center', // minWidth: 34, // minHeight: 34, minWidth: 27, minHeight: 27, padding: 4, fontSize: '0.813rem', lineHeight: '1rem', borderRadius: 100, } as Interpolation; const tabWrapTheme = { display: 'flex', alignItems: 'center', gap: 4, } as Interpolation; const tabTheme = { display: 'flex', alignItems: 'center', justifyContent: 'center', minWidth: 27, minHeight: 27, borderRadius: 100, backgroundColor: '#f5f5f5', '&:hover': { backgroundColor: '#f4f4f4' }, '&:active': { scale: 0.9 }, } as Interpolation;