1+ import { useRef } from 'react' ;
12import {
23 Pagination ,
34 PaginationContent ,
@@ -19,8 +20,18 @@ export const PaginatedNavigation = ({
1920 totalPages,
2021 onPageChange,
2122} : PaginationControlsProps ) => {
23+ // Keep stable totalPages to prevent pagination from disappearing during loading
24+ const lastValidTotalPagesRef = useRef < number > ( 1 ) ;
25+
26+ // Only update the ref if we have a valid totalPages (> 0)
27+ if ( totalPages > 0 ) {
28+ lastValidTotalPagesRef . current = totalPages ;
29+ }
30+
31+ const stableTotalPages = lastValidTotalPagesRef . current ;
32+
2233 // Don't render pagination if no pages or invalid state
23- if ( ! totalPages || totalPages <= 0 || currentPage <= 0 ) {
34+ if ( ! stableTotalPages || stableTotalPages <= 0 || currentPage <= 0 ) {
2435 return null ;
2536 }
2637
@@ -31,22 +42,22 @@ export const PaginatedNavigation = ({
3142 const isMobile = typeof window !== 'undefined' && window . innerWidth < 640 ;
3243 const maxVisiblePages = isMobile ? 3 : 7 ;
3344
34- if ( totalPages <= maxVisiblePages ) {
45+ if ( stableTotalPages <= maxVisiblePages ) {
3546 // Show all pages if within limit
36- for ( let i = 1 ; i <= totalPages ; i ++ ) {
47+ for ( let i = 1 ; i <= stableTotalPages ; i ++ ) {
3748 pages . push ( i ) ;
3849 }
3950 } else if ( isMobile ) {
4051 // Mobile: simplified pagination - only show current and neighbors
4152 if ( currentPage === 1 ) {
4253 // At start: 1 2 ... last
43- pages . push ( 1 , 2 , 'ellipsis' , totalPages ) ;
44- } else if ( currentPage === totalPages ) {
54+ pages . push ( 1 , 2 , 'ellipsis' , stableTotalPages ) ;
55+ } else if ( currentPage === stableTotalPages ) {
4556 // At end: 1 ... (last-1) last
46- pages . push ( 1 , 'ellipsis' , totalPages - 1 , totalPages ) ;
57+ pages . push ( 1 , 'ellipsis' , stableTotalPages - 1 , stableTotalPages ) ;
4758 } else {
4859 // Middle: 1 ... current ... last
49- pages . push ( 1 , 'ellipsis' , currentPage , 'ellipsis' , totalPages ) ;
60+ pages . push ( 1 , 'ellipsis' , currentPage , 'ellipsis' , stableTotalPages ) ;
5061 }
5162 } else {
5263 // Desktop: full pagination logic
@@ -58,11 +69,11 @@ export const PaginatedNavigation = ({
5869 pages . push ( i ) ;
5970 }
6071 pages . push ( 'ellipsis' ) ;
61- pages . push ( totalPages ) ;
62- } else if ( currentPage >= totalPages - 2 ) {
72+ pages . push ( stableTotalPages ) ;
73+ } else if ( currentPage >= stableTotalPages - 2 ) {
6374 // Near end: 1 ... (last-3) (last-2) (last-1) last
6475 pages . push ( 'ellipsis' ) ;
65- for ( let i = totalPages - 3 ; i <= totalPages ; i ++ ) {
76+ for ( let i = stableTotalPages - 3 ; i <= stableTotalPages ; i ++ ) {
6677 pages . push ( i ) ;
6778 }
6879 } else {
@@ -72,7 +83,7 @@ export const PaginatedNavigation = ({
7283 pages . push ( i ) ;
7384 }
7485 pages . push ( 'ellipsis' ) ;
75- pages . push ( totalPages ) ;
86+ pages . push ( stableTotalPages ) ;
7687 }
7788 }
7889
@@ -86,7 +97,7 @@ export const PaginatedNavigation = ({
8697 } ;
8798
8899 const handleNext = ( ) => {
89- if ( currentPage < totalPages ) onPageChange ( currentPage + 1 ) ;
100+ if ( currentPage < stableTotalPages ) onPageChange ( currentPage + 1 ) ;
90101 } ;
91102
92103 return (
@@ -122,7 +133,9 @@ export const PaginatedNavigation = ({
122133 < PaginationNext
123134 onClick = { handleNext }
124135 className = {
125- currentPage === totalPages ? 'pointer-events-none opacity-50' : ''
136+ currentPage === stableTotalPages
137+ ? 'pointer-events-none opacity-50'
138+ : ''
126139 }
127140 />
128141 </ PaginationItem >
0 commit comments