Skip to content

Commit c7d0efe

Browse files
committed
fix: api.util.resetApiState should reset useQuery hooks
1 parent a41438c commit c7d0efe

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

packages/toolkit/src/query/react/buildHooks.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,8 +521,33 @@ export function buildHooks<Definitions extends EndpointDefinitions>({
521521

522522
function queryStatePreSelector(
523523
currentState: QueryResultSelectorResult<any>,
524-
lastResult?: UseQueryStateDefaultResult<any>
524+
lastResult: UseQueryStateDefaultResult<any> | undefined,
525+
queryArgs: any
525526
): UseQueryStateDefaultResult<any> {
527+
// if we had a last result and the current result is uninitialized,
528+
// we might have called `api.util.resetApiState`
529+
// in this case, reset the hook
530+
if (lastResult?.endpointName && currentState.isUninitialized) {
531+
const { endpointName } = lastResult
532+
const endpointDefinition = context.endpointDefinitions[endpointName]
533+
if (
534+
serializeQueryArgs({
535+
queryArgs: lastResult.originalArgs,
536+
endpointDefinition,
537+
endpointName,
538+
}) ===
539+
serializeQueryArgs({
540+
queryArgs,
541+
endpointDefinition,
542+
endpointName,
543+
})
544+
)
545+
return {
546+
isFetching: false,
547+
...currentState,
548+
}
549+
}
550+
526551
// data is the last known good request result we have tracked - or if none has been tracked yet the last good result for the current args
527552
let data = currentState.isSuccess ? currentState.data : lastResult?.data
528553
if (data === undefined) data = currentState.data
@@ -733,7 +758,11 @@ export function buildHooks<Definitions extends EndpointDefinitions>({
733758
const selectDefaultResult = useMemo(
734759
() =>
735760
createSelector(
736-
[select(stableArg), (_: any, lastResult: any) => lastResult],
761+
[
762+
select(stableArg),
763+
(_: any, lastResult: any) => lastResult,
764+
() => stableArg,
765+
],
737766
queryStatePreSelector
738767
),
739768
[select, stableArg]

packages/toolkit/src/query/tests/buildHooks.test.tsx

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,53 @@ describe('hooks tests', () => {
547547
expect(screen.getByTestId('amount').textContent).toBe('2')
548548
)
549549
})
550+
551+
describe('api.util.resetApiState resets hook', () => {
552+
test('without `selectFromResult`', async () => {
553+
const { result } = renderHook(() => api.endpoints.getUser.useQuery(5), {
554+
wrapper: storeRef.wrapper,
555+
})
556+
557+
await waitFor(() => expect(result.current.isSuccess).toBe(true))
558+
559+
act(() => void storeRef.store.dispatch(api.util.resetApiState()))
560+
561+
expect(result.current).toEqual({
562+
isError: false,
563+
isFetching: true,
564+
isLoading: true,
565+
isSuccess: false,
566+
isUninitialized: false,
567+
refetch: expect.any(Function),
568+
status: 'pending',
569+
})
570+
})
571+
test('with `selectFromResult`', async () => {
572+
const { result } = renderHook(
573+
() =>
574+
api.endpoints.getUser.useQuery(5, {
575+
selectFromResult: (x) => x,
576+
}),
577+
{
578+
wrapper: storeRef.wrapper,
579+
}
580+
)
581+
582+
await waitFor(() => expect(result.current.isSuccess).toBe(true))
583+
584+
act(() => void storeRef.store.dispatch(api.util.resetApiState()))
585+
586+
expect(result.current).toEqual({
587+
isError: false,
588+
isFetching: false,
589+
isLoading: false,
590+
isSuccess: false,
591+
isUninitialized: true,
592+
refetch: expect.any(Function),
593+
status: 'uninitialized',
594+
})
595+
})
596+
})
550597
})
551598

552599
describe('useLazyQuery', () => {

0 commit comments

Comments
 (0)