From d40985401e9224452b6024da96bfe900db06d711 Mon Sep 17 00:00:00 2001 From: Dominik Dorfmeister Date: Sun, 13 Oct 2024 11:21:25 +0200 Subject: [PATCH] fix(react-query): do not overwrite staleTime with the suspense default value if it's a function (#8174) * fix(react-query): do not overwrite staleTime with the suspense default value if it's a function * test: improve * chore: fix test --- .../src/__tests__/suspense.test.tsx | 40 +++++++++++++++++++ packages/react-query/src/suspense.ts | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/react-query/src/__tests__/suspense.test.tsx b/packages/react-query/src/__tests__/suspense.test.tsx index 8607b0bde2..2b55386fde 100644 --- a/packages/react-query/src/__tests__/suspense.test.tsx +++ b/packages/react-query/src/__tests__/suspense.test.tsx @@ -382,6 +382,46 @@ describe('useSuspenseQuery', () => { await waitFor(() => rendered.getByText('fetching: false')) }) + it('should set staleTime when having passed a function', async () => { + const key = queryKey() + let count = 0 + + function Component() { + const result = useSuspenseQuery({ + queryKey: key, + queryFn: async () => { + await sleep(5) + count++ + return count + }, + staleTime: () => 60 * 1000, + }) + return ( +
+ data: {result.data} +
+ ) + } + + function Page() { + return ( + + + + ) + } + + const rendered = renderWithClient(queryClient, ) + + await waitFor(() => rendered.getByText('Loading...')) + await waitFor(() => rendered.getByText('data: 1')) + + expect( + typeof queryClient.getQueryCache().find({ queryKey: key })?.observers[0] + ?.options.staleTime, + ).toBe('function') + }) + it('should suspend when switching to a new query', async () => { const key1 = queryKey() const key2 = queryKey() diff --git a/packages/react-query/src/suspense.ts b/packages/react-query/src/suspense.ts index 6c3d04f264..497bb83bd8 100644 --- a/packages/react-query/src/suspense.ts +++ b/packages/react-query/src/suspense.ts @@ -24,7 +24,7 @@ export const ensureSuspenseTimers = ( if (defaultedOptions.suspense) { // Always set stale time when using suspense to prevent // fetching again when directly mounting after suspending - if (typeof defaultedOptions.staleTime !== 'number') { + if (defaultedOptions.staleTime === undefined) { defaultedOptions.staleTime = 1000 } if (typeof defaultedOptions.gcTime === 'number') {