diff --git a/packages/react-query/src/__tests__/suspense.test.tsx b/packages/react-query/src/__tests__/suspense.test.tsx index f13164b1b0..a45aa516d2 100644 --- a/packages/react-query/src/__tests__/suspense.test.tsx +++ b/packages/react-query/src/__tests__/suspense.test.tsx @@ -1192,4 +1192,48 @@ describe('useSuspenseQueries', () => { await waitFor(() => rendered.getByText('data1')) }) + + it('should show error boundary even with gcTime:0 (#7853)', async () => { + const consoleMock = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined) + const key = queryKey() + let count = 0 + + function Page() { + useSuspenseQuery({ + queryKey: key, + queryFn: async () => { + count++ + console.log('queryFn') + throw new Error('Query failed') + }, + gcTime: 0, + retry: false, + }) + + return null + } + + function App() { + return ( + + { + console.log('fallback renders') + return
There was an error!
+ }} + > + +
+
+ ) + } + + const rendered = renderWithClient(queryClient, ) + + await waitFor(() => rendered.getByText('There was an error!')) + expect(count).toBe(1) + consoleMock.mockRestore() + }) }) diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index a22f214f42..0add70e376 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -4198,17 +4198,15 @@ describe('useQuery', () => { it('should not interval fetch with a refetchInterval of 0', async () => { const key = queryKey() - const states: Array> = [] + const queryFn = vi.fn(() => 1) function Page() { const queryInfo = useQuery({ queryKey: key, - queryFn: () => 1, + queryFn, refetchInterval: 0, }) - states.push(queryInfo) - return
count: {queryInfo.data}
} @@ -4218,20 +4216,7 @@ describe('useQuery', () => { await sleep(10) // extra sleep to make sure we're not re-fetching - expect(states.length).toEqual(2) - - expect(states).toMatchObject([ - { - status: 'pending', - isFetching: true, - data: undefined, - }, - { - status: 'success', - isFetching: false, - data: 1, - }, - ]) + expect(queryFn).toHaveBeenCalledTimes(1) }) it('should accept an empty string as query key', async () => { diff --git a/packages/react-query/src/suspense.ts b/packages/react-query/src/suspense.ts index 533069ae6b..6c3d04f264 100644 --- a/packages/react-query/src/suspense.ts +++ b/packages/react-query/src/suspense.ts @@ -18,7 +18,7 @@ export const defaultThrowOnError = < query: Query, ) => query.state.data === undefined -export const ensureStaleTime = ( +export const ensureSuspenseTimers = ( defaultedOptions: DefaultedQueryObserverOptions, ) => { if (defaultedOptions.suspense) { @@ -27,6 +27,9 @@ export const ensureStaleTime = ( if (typeof defaultedOptions.staleTime !== 'number') { defaultedOptions.staleTime = 1000 } + if (typeof defaultedOptions.gcTime === 'number') { + defaultedOptions.gcTime = Math.max(defaultedOptions.gcTime, 1000) + } } } diff --git a/packages/react-query/src/useBaseQuery.ts b/packages/react-query/src/useBaseQuery.ts index 381ff79ca8..f6b632c8ff 100644 --- a/packages/react-query/src/useBaseQuery.ts +++ b/packages/react-query/src/useBaseQuery.ts @@ -10,7 +10,11 @@ import { getHasError, useClearResetErrorBoundary, } from './errorBoundaryUtils' -import { ensureStaleTime, fetchOptimistic, shouldSuspend } from './suspense' +import { + ensureSuspenseTimers, + fetchOptimistic, + shouldSuspend, +} from './suspense' import type { UseBaseQueryOptions } from './types' import type { QueryClient, @@ -58,7 +62,7 @@ export function useBaseQuery< ? 'isRestoring' : 'optimistic' - ensureStaleTime(defaultedOptions) + ensureSuspenseTimers(defaultedOptions) ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary) useClearResetErrorBoundary(errorResetBoundary) diff --git a/packages/react-query/src/useQueries.ts b/packages/react-query/src/useQueries.ts index 1360426763..4ed5b4cedc 100644 --- a/packages/react-query/src/useQueries.ts +++ b/packages/react-query/src/useQueries.ts @@ -15,7 +15,7 @@ import { useClearResetErrorBoundary, } from './errorBoundaryUtils' import { - ensureStaleTime, + ensureSuspenseTimers, fetchOptimistic, shouldSuspend, willFetch, @@ -255,7 +255,7 @@ export function useQueries< ) defaultedQueries.forEach((query) => { - ensureStaleTime(query) + ensureSuspenseTimers(query) ensurePreventErrorBoundaryRetry(query, errorResetBoundary) })