From 20356608be01e3fd2ba2ac7790cfd25e941b0072 Mon Sep 17 00:00:00 2001 From: "Junius Free B. Fontamillas" <8164667+juniusfree@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:23:23 +0800 Subject: [PATCH 1/3] fix: useQuery hook does not refetch after resetApiState --- .../toolkit/src/query/react/buildHooks.ts | 8 +-- .../src/query/tests/buildHooks.test.tsx | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/packages/toolkit/src/query/react/buildHooks.ts b/packages/toolkit/src/query/react/buildHooks.ts index 3496e934ef..86ee665d82 100644 --- a/packages/toolkit/src/query/react/buildHooks.ts +++ b/packages/toolkit/src/query/react/buildHooks.ts @@ -1661,8 +1661,6 @@ export function buildHooks({ skipPollingIfUnfocused, }) - const lastRenderHadSubscription = useRef(false) - const initialPageParam = (rest as UseInfiniteQuerySubscriptionOptions) .initialPageParam const stableInitialPageParam = useShallowStableValue(initialPageParam) @@ -1686,11 +1684,7 @@ export function buildHooks({ } const subscriptionRemoved = - !currentRenderHasSubscription && lastRenderHadSubscription.current - - usePossiblyImmediateEffect(() => { - lastRenderHadSubscription.current = currentRenderHasSubscription - }) + !currentRenderHasSubscription && promiseRef.current !== undefined usePossiblyImmediateEffect((): void | undefined => { if (subscriptionRemoved) { diff --git a/packages/toolkit/src/query/tests/buildHooks.test.tsx b/packages/toolkit/src/query/tests/buildHooks.test.tsx index 81af7c40ca..6679ec609b 100644 --- a/packages/toolkit/src/query/tests/buildHooks.test.tsx +++ b/packages/toolkit/src/query/tests/buildHooks.test.tsx @@ -902,6 +902,71 @@ describe('hooks tests', () => { status: 'uninitialized', }) }) + + test('reset after unmount/remount', async () => { + const user = userEvent.setup() + + function QueryComponent() { + const { isLoading, data } = api.endpoints.getUser.useQuery(1) + + if (isLoading) { + return

Loading...

+ } + + return

{data?.name}

+ } + + function Wrapper() { + const [open, setOpen] = useState(true) + + const handleRerender = () => { + setOpen(false) + setTimeout(() => { + setOpen(true) + }, 1000) + } + + const handleReset = () => { + storeRef.store.dispatch(api.util.resetApiState()) + } + + return ( + <> + + {open ? ( +
+ + + +
+ ) : null} + + ) + } + + render(, { wrapper: storeRef.wrapper }) + + await user.click( + screen.getByRole('button', { name: /Rerender component/i }), + ) + await waitFor(() => { + expect(screen.getByText('Timmy')).toBeTruthy() + }) + + await user.click( + screen.getByRole('button', { name: /reset api state/i }), + ) + await waitFor(() => { + expect(screen.queryByText('Loading...')).toBeNull() + }) + await waitFor(() => { + expect(screen.getByText('Timmy')).toBeTruthy() + }) + }) }) test('useQuery refetch method returns a promise that resolves with the result', async () => { From 07898dd8f514c1fc84efddbe6d5c9b8347a68c4c Mon Sep 17 00:00:00 2001 From: "Junius Free B. Fontamillas" <8164667+juniusfree@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:27:25 +0800 Subject: [PATCH 2/3] Update packages/toolkit/src/query/tests/buildHooks.test.tsx --- packages/toolkit/src/query/tests/buildHooks.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolkit/src/query/tests/buildHooks.test.tsx b/packages/toolkit/src/query/tests/buildHooks.test.tsx index 6679ec609b..0d2af5b3fc 100644 --- a/packages/toolkit/src/query/tests/buildHooks.test.tsx +++ b/packages/toolkit/src/query/tests/buildHooks.test.tsx @@ -903,7 +903,7 @@ describe('hooks tests', () => { }) }) - test('reset after unmount/remount', async () => { + test('hook should not be stuck loading post resetApiState after re-render', async () => { const user = userEvent.setup() function QueryComponent() { From 1eb26d1830373e111cffae7063d05f90b222731b Mon Sep 17 00:00:00 2001 From: Mark Erikson Date: Sun, 6 Apr 2025 14:45:23 -0400 Subject: [PATCH 3/3] Try fixing flaky timeout test --- packages/toolkit/src/query/tests/createApi.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/toolkit/src/query/tests/createApi.test.ts b/packages/toolkit/src/query/tests/createApi.test.ts index 6b1e8a093f..9fc0b11ded 100644 --- a/packages/toolkit/src/query/tests/createApi.test.ts +++ b/packages/toolkit/src/query/tests/createApi.test.ts @@ -1181,7 +1181,7 @@ describe('timeout behavior', () => { http.get( 'https://example.com/success', async () => { - await delay(10) + await delay(50) return HttpResponse.json({ value: 'failed' }, { status: 500 }) }, { once: true },