@@ -39,9 +39,12 @@ export interface UsePaginatedListResult<T> {
3939 /** Current page items */
4040 items : T [ ] ;
4141
42- /** True during initial load or page navigation */
42+ /** True during initial load only (no items yet) */
4343 loading : boolean ;
4444
45+ /** True when navigating between pages (shows existing items while loading) */
46+ navigating : boolean ;
47+
4548 /** Error from last fetch attempt */
4649 error : Error | null ;
4750
@@ -96,6 +99,7 @@ export function useCursorPagination<T>(
9699 // State
97100 const [ items , setItems ] = React . useState < T [ ] > ( [ ] ) ;
98101 const [ loading , setLoading ] = React . useState ( true ) ;
102+ const [ navigating , setNavigating ] = React . useState ( false ) ;
99103 const [ error , setError ] = React . useState < Error | null > ( null ) ;
100104 const [ currentPage , setCurrentPage ] = React . useState ( 0 ) ;
101105 const [ hasMore , setHasMore ] = React . useState ( false ) ;
@@ -141,9 +145,10 @@ export function useCursorPagination<T>(
141145 * Fetch a specific page
142146 * @param page - Page number to fetch (0-indexed)
143147 * @param isInitialLoad - Whether this is the initial load (shows loading state)
148+ * @param isNavigation - Whether this is a page navigation (shows navigating state)
144149 */
145150 const fetchPageData = React . useCallback (
146- async ( page : number , isInitialLoad : boolean = false ) => {
151+ async ( page : number , isInitialLoad : boolean = false , isNavigation : boolean = false ) => {
147152 if ( ! isMountedRef . current ) return ;
148153 if ( isFetchingRef . current ) return ;
149154
@@ -153,6 +158,9 @@ export function useCursorPagination<T>(
153158 if ( isInitialLoad ) {
154159 setLoading ( true ) ;
155160 }
161+ if ( isNavigation ) {
162+ setNavigating ( true ) ;
163+ }
156164 setError ( null ) ;
157165
158166 // Determine startingAt cursor:
@@ -190,6 +198,7 @@ export function useCursorPagination<T>(
190198 } finally {
191199 if ( isMountedRef . current ) {
192200 setLoading ( false ) ;
201+ setNavigating ( false ) ;
193202 }
194203 isFetchingRef . current = false ;
195204 }
@@ -227,20 +236,20 @@ export function useCursorPagination<T>(
227236
228237 // Navigation functions
229238 const nextPage = React . useCallback ( ( ) => {
230- if ( ! loading && hasMore ) {
239+ if ( ! loading && ! navigating && hasMore ) {
231240 const newPage = currentPage + 1 ;
232241 setCurrentPage ( newPage ) ;
233- fetchPageData ( newPage , true ) ;
242+ fetchPageData ( newPage , false , true ) ;
234243 }
235- } , [ loading , hasMore , currentPage , fetchPageData ] ) ;
244+ } , [ loading , navigating , hasMore , currentPage , fetchPageData ] ) ;
236245
237246 const prevPage = React . useCallback ( ( ) => {
238- if ( ! loading && currentPage > 0 ) {
247+ if ( ! loading && ! navigating && currentPage > 0 ) {
239248 const newPage = currentPage - 1 ;
240249 setCurrentPage ( newPage ) ;
241- fetchPageData ( newPage , true ) ;
250+ fetchPageData ( newPage , false , true ) ;
242251 }
243- } , [ loading , currentPage , fetchPageData ] ) ;
252+ } , [ loading , navigating , currentPage , fetchPageData ] ) ;
244253
245254 const refresh = React . useCallback ( ( ) => {
246255 fetchPageData ( currentPage , false ) ;
@@ -249,6 +258,7 @@ export function useCursorPagination<T>(
249258 return {
250259 items,
251260 loading,
261+ navigating,
252262 error,
253263 currentPage,
254264 hasMore,
0 commit comments