1+ 'use client' ;
2+ import { useState , useEffect } from 'react' ;
3+ import { useRouter , useSearchParams } from 'next/navigation' ;
4+ import React from 'react' ;
5+
6+ interface PaginationProps {
7+ totalPages : number ;
8+ currentPage : number ;
9+ onPageChange : ( newPage : number ) => void ;
10+ }
11+
12+ const ResponsivePagination = ( { totalPages, currentPage, onPageChange } : PaginationProps ) => {
13+ const router = useRouter ( ) ;
14+ const searchParams = useSearchParams ( ) ;
15+ const [ pageNumbers , setPageNumbers ] = useState < number [ ] > ( [ ] ) ;
16+ const [ currentRange , setCurrentRange ] = useState < number > ( 0 ) ;
17+ const [ isMobile , setIsMobile ] = useState < boolean > ( false ) ;
18+
19+ useEffect ( ( ) => {
20+ const pageSize = isMobile ? 5 : 10 ;
21+ const range = Math . floor ( ( currentPage - 1 ) / pageSize ) ;
22+ setCurrentRange ( range ) ;
23+ } , [ currentPage , isMobile ] ) ;
24+
25+ useEffect ( ( ) => {
26+ const checkScreenSize = ( ) => setIsMobile ( window . innerWidth < 768 ) ;
27+ checkScreenSize ( ) ;
28+ window . addEventListener ( 'resize' , checkScreenSize ) ;
29+ return ( ) => window . removeEventListener ( 'resize' , checkScreenSize ) ;
30+ } , [ ] ) ;
31+
32+ useEffect ( ( ) => {
33+ const pageSize = isMobile ? 5 : 10 ;
34+ const start = currentRange * pageSize + 1 ;
35+ const end = Math . min ( start + pageSize - 1 , totalPages ) ;
36+ const pages : number [ ] = [ ] ;
37+ for ( let i = start ; i <= end ; i ++ ) {
38+ pages . push ( i ) ;
39+ }
40+ setPageNumbers ( pages ) ;
41+ } , [ currentRange , totalPages , isMobile ] ) ;
42+
43+ const handlePageClick = ( page : number ) => {
44+ onPageChange ( page ) ;
45+ const params = new URLSearchParams ( searchParams . toString ( ) ) ;
46+ params . set ( 'page' , page . toString ( ) ) ;
47+ router . replace ( `?${ params . toString ( ) } ` , { scroll : false } ) ;
48+ } ;
49+
50+ const handleNextRange = ( ) => {
51+ const pageSize = isMobile ? 5 : 10 ;
52+ if ( ( currentRange + 1 ) * pageSize < totalPages ) {
53+ const newRange = currentRange + 1 ;
54+ setCurrentRange ( newRange ) ;
55+ const firstPageOfNextRange = newRange * pageSize + 1 ;
56+ handlePageClick ( firstPageOfNextRange ) ;
57+ }
58+ } ;
59+
60+ const handlePrevRange = ( ) => {
61+ if ( currentRange > 0 ) {
62+ const pageSize = isMobile ? 5 : 10 ;
63+ const newRange = currentRange - 1 ;
64+ setCurrentRange ( newRange ) ;
65+ const firstPageOfPrevRange = newRange * pageSize + 1 ;
66+ handlePageClick ( firstPageOfPrevRange ) ;
67+ }
68+ } ;
69+
70+ return (
71+ < div className = "flex justify-center items-center space-x-2 mt-10 mb-10" >
72+ < button
73+ onClick = { handlePrevRange }
74+ disabled = { currentRange === 0 }
75+ className = "px-3 py-1 border rounded disabled:opacity-50" >
76+ <
77+ </ button >
78+ { pageNumbers . map ( ( page ) => (
79+ < button
80+ key = { page }
81+ onClick = { ( ) => handlePageClick ( page ) }
82+ className = { `px-3 py-1 border rounded ${ page === currentPage ? 'bg-purple-600 text-white' : 'bg-white text-black' } ` } >
83+ { page }
84+ </ button >
85+ ) ) }
86+ < button
87+ onClick = { handleNextRange }
88+ disabled = { ( currentRange + 1 ) * ( isMobile ? 5 : 10 ) >= totalPages }
89+ className = "px-3 py-1 border rounded disabled:opacity-50" >
90+ >
91+ </ button >
92+ </ div >
93+ ) ;
94+ } ;
95+
96+ export default ResponsivePagination ;
0 commit comments