From 1a58378b8c61cedd1d2c108f15741e87256b82cd Mon Sep 17 00:00:00 2001 From: EduardF1 <50618110+EduardF1@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:58:16 +0200 Subject: [PATCH 1/2] fix react query error boundary retry on remount Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../__tests__/QueryResetErrorBoundary.test.tsx | 16 ++++++---------- packages/react-query/src/errorBoundaryUtils.ts | 9 +++++++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx index 21d594129fb..e878f9d537a 100644 --- a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx +++ b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx @@ -294,7 +294,7 @@ describe('QueryErrorResetBoundary', () => { consoleMock.mockRestore() }) - it('should not retry fetch if the reset error boundary has not been reset', async () => { + it('should retry fetch on remount even if the reset error boundary has not been reset', async () => { const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -302,12 +302,14 @@ describe('QueryErrorResetBoundary', () => { const key = queryKey() let succeed = false + let fetchCount = 0 function Page() { const { data } = useQuery({ queryKey: key, queryFn: () => sleep(10).then(() => { + fetchCount++ if (!succeed) throw new Error('Error') return 'data' }), @@ -350,7 +352,8 @@ describe('QueryErrorResetBoundary', () => { fireEvent.click(rendered.getByText('retry')) await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('error boundary')).toBeInTheDocument() + expect(rendered.getByText('data')).toBeInTheDocument() + expect(fetchCount).toBe(2) consoleMock.mockRestore() }) @@ -419,7 +422,7 @@ describe('QueryErrorResetBoundary', () => { consoleMock.mockRestore() }) - it('should not retry fetch if the reset error boundary has not been reset after a previous reset', async () => { + it('should retry fetch on remount if the reset error boundary has not been reset after a previous reset', async () => { const consoleMock = vi .spyOn(console, 'error') .mockImplementation(() => undefined) @@ -487,13 +490,6 @@ describe('QueryErrorResetBoundary', () => { succeed = true shouldReset = false - fireEvent.click(rendered.getByText('retry')) - await vi.advanceTimersByTimeAsync(11) - expect(rendered.getByText('error boundary')).toBeInTheDocument() - - succeed = true - shouldReset = true - fireEvent.click(rendered.getByText('retry')) await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('data')).toBeInTheDocument() diff --git a/packages/react-query/src/errorBoundaryUtils.ts b/packages/react-query/src/errorBoundaryUtils.ts index 734cc74d3de..ad9d0954bf3 100644 --- a/packages/react-query/src/errorBoundaryUtils.ts +++ b/packages/react-query/src/errorBoundaryUtils.ts @@ -37,8 +37,13 @@ export const ensurePreventErrorBoundaryRetry = < options.experimental_prefetchInRender || throwOnError ) { - // Prevent retrying failed query if the error boundary has not been reset yet - if (!errorResetBoundary.isReset()) { + // Prevent retrying failed query if the error boundary has not been reset yet. + // Allow retries on a fresh mount after the error boundary has unmounted the + // failed observer. + if ( + !errorResetBoundary.isReset() && + (options.suspense || query?.getObserversCount()) + ) { options.retryOnMount = false } } From b9a9576d831a7a244152ff978109fe9fedbfbbd8 Mon Sep 17 00:00:00 2001 From: EduardF1 <50618110+EduardF1@users.noreply.github.com> Date: Tue, 16 Jun 2026 14:58:16 +0200 Subject: [PATCH 2/2] test: retry error boundary stale infinity case Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../react-query/src/__tests__/QueryResetErrorBoundary.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx index e878f9d537a..b545bbc0003 100644 --- a/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx +++ b/packages/react-query/src/__tests__/QueryResetErrorBoundary.test.tsx @@ -483,6 +483,7 @@ describe('QueryErrorResetBoundary', () => { succeed = false shouldReset = true + fireEvent.click(rendered.getByText('retry')) await vi.advanceTimersByTimeAsync(11) expect(rendered.getByText('error boundary')).toBeInTheDocument() expect(rendered.getByText('retry')).toBeInTheDocument()