diff --git a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx index cdc0049ee8..334e3a5550 100644 --- a/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx +++ b/packages/query-core/src/__tests__/infiniteQueryObserver.test.tsx @@ -103,6 +103,41 @@ describe('InfiniteQueryObserver', () => { expect(all).toEqual(['next0', 'next0,1', 'prev0,1']) }) + test('should not invoke getNextPageParam and getPreviousPageParam on empty pages', async () => { + const key = queryKey() + + const getNextPageParam = vi.fn() + const getPreviousPageParam = vi.fn() + + const observer = new InfiniteQueryObserver(queryClient, { + queryKey: key, + queryFn: ({ pageParam }) => String(pageParam), + initialPageParam: 1, + getNextPageParam: getNextPageParam.mockImplementation( + (_, __, lastPageParam) => { + return lastPageParam + 1 + }, + ), + getPreviousPageParam: getPreviousPageParam.mockImplementation( + (_, __, firstPageParam) => { + return firstPageParam - 1 + }, + ), + }) + + const unsubscribe = observer.subscribe(() => {}) + + getNextPageParam.mockClear() + getPreviousPageParam.mockClear() + + queryClient.setQueryData(key, { pages: [], pageParams: [] }) + + expect(getNextPageParam).toHaveBeenCalledTimes(0) + expect(getPreviousPageParam).toHaveBeenCalledTimes(0) + + unsubscribe() + }) + test('should stop refetching if undefined is returned from getNextPageParam', async () => { const key = queryKey() let next: number | undefined = 2 diff --git a/packages/query-core/src/infiniteQueryBehavior.ts b/packages/query-core/src/infiniteQueryBehavior.ts index 57bcfa2312..90bf8af2a4 100644 --- a/packages/query-core/src/infiniteQueryBehavior.ts +++ b/packages/query-core/src/infiniteQueryBehavior.ts @@ -133,24 +133,23 @@ function getNextPageParam( { pages, pageParams }: InfiniteData, ): unknown | undefined { const lastIndex = pages.length - 1 - return options.getNextPageParam( - pages[lastIndex], - pages, - pageParams[lastIndex], - pageParams, - ) + return pages.length > 0 + ? options.getNextPageParam( + pages[lastIndex], + pages, + pageParams[lastIndex], + pageParams, + ) + : undefined } function getPreviousPageParam( options: InfiniteQueryPageParamsOptions, { pages, pageParams }: InfiniteData, ): unknown | undefined { - return options.getPreviousPageParam?.( - pages[0], - pages, - pageParams[0], - pageParams, - ) + return pages.length > 0 + ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) + : undefined } /**