Skip to content

Commit b0877ea

Browse files
committed
Fix upsertQueryEntries for infinite queries
1 parent d11489c commit b0877ea

File tree

3 files changed

+53
-19
lines changed

3 files changed

+53
-19
lines changed

packages/toolkit/src/query/core/buildSlice.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ import type {
2929
} from './apiState'
3030
import { QueryStatus } from './apiState'
3131
import type {
32+
AllQueryKeys,
33+
QueryArgFromAnyQueryDefinition,
34+
DataFromAnyQueryDefinition,
3235
InfiniteQueryThunk,
3336
MutationThunk,
3437
QueryThunk,
@@ -64,11 +67,11 @@ import type { InternalSerializeQueryArgs } from '../defaultSerializeQueryArgs'
6467
*/
6568
export type NormalizedQueryUpsertEntry<
6669
Definitions extends EndpointDefinitions,
67-
EndpointName extends QueryKeys<Definitions>,
70+
EndpointName extends AllQueryKeys<Definitions>,
6871
> = {
6972
endpointName: EndpointName
70-
arg: QueryArgFrom<Definitions[EndpointName]>
71-
value: ResultTypeFrom<Definitions[EndpointName]>
73+
arg: QueryArgFromAnyQueryDefinition<Definitions, EndpointName>
74+
value: DataFromAnyQueryDefinition<Definitions, EndpointName>
7275
}
7376

7477
/**
@@ -89,7 +92,7 @@ export type ProcessedQueryUpsertEntry = {
8992
* A typesafe representation of a util action creator that accepts cache entry descriptions to upsert
9093
*/
9194
export type UpsertEntries<Definitions extends EndpointDefinitions> = (<
92-
EndpointNames extends Array<QueryKeys<Definitions>>,
95+
EndpointNames extends Array<AllQueryKeys<Definitions>>,
9396
>(
9497
entries: [
9598
...{

packages/toolkit/src/query/core/buildThunks.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
ThunkDispatch,
77
UnknownAction,
88
} from '@reduxjs/toolkit'
9+
import util from 'util'
910
import type { Patch } from 'immer'
1011
import { isDraftable, produceWithPatches } from 'immer'
1112
import type { Api, ApiContext } from '../apiTypes'
@@ -198,11 +199,11 @@ export type PatchQueryDataThunk<
198199
updateProvided?: boolean,
199200
) => ThunkAction<void, PartialState, any, UnknownAction>
200201

201-
type AllQueryKeys<Definitions extends EndpointDefinitions> =
202+
export type AllQueryKeys<Definitions extends EndpointDefinitions> =
202203
| QueryKeys<Definitions>
203204
| InfiniteQueryKeys<Definitions>
204205

205-
type QueryArgFromAnyQueryDefinition<
206+
export type QueryArgFromAnyQueryDefinition<
206207
Definitions extends EndpointDefinitions,
207208
EndpointName extends AllQueryKeys<Definitions>,
208209
> =
@@ -218,7 +219,7 @@ type QueryArgFromAnyQueryDefinition<
218219
? QueryArgFrom<Definitions[EndpointName]>
219220
: never
220221

221-
type DataFromAnyQueryDefinition<
222+
export type DataFromAnyQueryDefinition<
222223
Definitions extends EndpointDefinitions,
223224
EndpointName extends AllQueryKeys<Definitions>,
224225
> =
@@ -237,7 +238,7 @@ type DataFromAnyQueryDefinition<
237238
? ResultTypeFrom<Definitions[EndpointName]>
238239
: unknown
239240

240-
type UpsertThunkResult<
241+
export type UpsertThunkResult<
241242
Definitions extends EndpointDefinitions,
242243
EndpointName extends AllQueryKeys<Definitions>,
243244
> =

packages/toolkit/src/query/tests/infiniteQueries.test.ts

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -557,9 +557,8 @@ describe('Infinite queries', () => {
557557
}),
558558
)
559559

560-
const entry1Updated = pokemonApi.endpoints.getInfinitePokemon.select(
561-
'fire',
562-
)(storeRef.store.getState())
560+
const selectFire = pokemonApi.endpoints.getInfinitePokemon.select('fire')
561+
const entry1Updated = selectFire(storeRef.store.getState())
563562

564563
expect(entry1Updated.data).toEqual({
565564
pages: [
@@ -577,18 +576,49 @@ describe('Infinite queries', () => {
577576
)
578577

579578
const entry2InitialLoad = await res2
580-
const entry2Updated = pokemonApi.endpoints.getInfinitePokemon.select(
581-
'water',
582-
)(storeRef.store.getState())
583-
584-
console.log(
585-
'entry2Updated',
586-
util.inspect(entry2Updated, { depth: Infinity }),
587-
)
579+
const selectWater = pokemonApi.endpoints.getInfinitePokemon.select('water')
580+
const entry2Updated = selectWater(storeRef.store.getState())
588581

589582
expect(entry2Updated.data).toEqual({
590583
pages: [[{ id: '2', name: 'Pokemon 2' }]],
591584
pageParams: [2],
592585
})
586+
587+
storeRef.store.dispatch(
588+
pokemonApi.util.upsertQueryEntries([
589+
{
590+
endpointName: 'getInfinitePokemon',
591+
arg: 'air',
592+
value: {
593+
pages: [[{ id: '3', name: 'Pokemon 3' }]],
594+
pageParams: [3],
595+
},
596+
},
597+
]),
598+
)
599+
600+
const selectAir = pokemonApi.endpoints.getInfinitePokemon.select('air')
601+
const entry3Initial = selectAir(storeRef.store.getState())
602+
603+
expect(entry3Initial.data).toEqual({
604+
pages: [[{ id: '3', name: 'Pokemon 3' }]],
605+
pageParams: [3],
606+
})
607+
608+
await storeRef.store.dispatch(
609+
pokemonApi.endpoints.getInfinitePokemon.initiate('air', {
610+
direction: 'forward',
611+
}),
612+
)
613+
614+
const entry3Updated = selectAir(storeRef.store.getState())
615+
616+
expect(entry3Updated.data).toEqual({
617+
pages: [
618+
[{ id: '3', name: 'Pokemon 3' }],
619+
[{ id: '4', name: 'Pokemon 4' }],
620+
],
621+
pageParams: [3, 4],
622+
})
593623
})
594624
})

0 commit comments

Comments
 (0)