Skip to content

Commit 66d27df

Browse files
committed
fix: stabilize pagination rendering during lading state
1 parent 83f837e commit 66d27df

File tree

1 file changed

+26
-13
lines changed

1 file changed

+26
-13
lines changed

src/components/PaginatedNavigation.tsx

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useRef } from 'react';
12
import {
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

Comments
 (0)