From 0b2f02872dd7bec09b57a1275aa5843eed3b73ba Mon Sep 17 00:00:00 2001 From: Niek Date: Fri, 18 Sep 2020 15:17:08 +0200 Subject: [PATCH] fix: query should try and throw again after error boundary reset --- .../ReactQueryResetErrorBoundary.test.tsx | 57 +++++++++++++++++++ src/react/useBaseQuery.ts | 17 +++--- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/react/tests/ReactQueryResetErrorBoundary.test.tsx b/src/react/tests/ReactQueryResetErrorBoundary.test.tsx index c708914488..fb8f65ab89 100644 --- a/src/react/tests/ReactQueryResetErrorBoundary.test.tsx +++ b/src/react/tests/ReactQueryResetErrorBoundary.test.tsx @@ -63,4 +63,61 @@ describe('ReactQueryResetErrorBoundary', () => { consoleMock.mockRestore() }) + + it('should throw again on error after the reset error boundary has been reset', async () => { + const key = queryKey() + const consoleMock = mockConsoleError() + let fetchCount = 0 + + function Page() { + const { data } = useQuery( + key, + async () => { + fetchCount++ + await sleep(10) + throw new Error('Error') + }, + { + retry: false, + useErrorBoundary: true, + } + ) + return
{data}
+ } + + const rendered = render( + + {({ reset }) => ( + ( +
+
error boundary
+ +
+ )} + > + +
+ )} +
+ ) + + await waitFor(() => rendered.getByText('error boundary')) + await waitFor(() => rendered.getByText('retry')) + fireEvent.click(rendered.getByText('retry')) + await waitFor(() => rendered.getByText('error boundary')) + await waitFor(() => rendered.getByText('retry')) + fireEvent.click(rendered.getByText('retry')) + await waitFor(() => rendered.getByText('error boundary')) + expect(fetchCount).toBe(3) + + consoleMock.mockRestore() + }) }) diff --git a/src/react/useBaseQuery.ts b/src/react/useBaseQuery.ts index 7aebcc9e08..fe217ca8f4 100644 --- a/src/react/useBaseQuery.ts +++ b/src/react/useBaseQuery.ts @@ -33,15 +33,14 @@ export function useBaseQuery( observerRef.current = observer // Subscribe to the observer - React.useEffect( - () => - observer.subscribe(() => { - if (isMounted()) { - rerender() - } - }), - [isMounted, observer, rerender] - ) + React.useEffect(() => { + errorResetBoundary.clearReset() + return observer.subscribe(() => { + if (isMounted()) { + rerender() + } + }) + }, [isMounted, observer, rerender, errorResetBoundary]) // Update config if (!firstRender) {