Skip to content

Commit 3f0b35f

Browse files
committed
WIP Try separating QueryArg and PageParam for infinite queries
1 parent 5ce06d1 commit 3f0b35f

File tree

7 files changed

+172
-120
lines changed

7 files changed

+172
-120
lines changed

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

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import type {
77
BaseEndpointDefinition,
88
ResultTypeFrom,
99
QueryArgFrom,
10+
InfiniteQueryDefinition,
11+
PageParamFrom,
1012
} from '../endpointDefinitions'
1113
import type { Id, WithRequiredProp } from '../tsHelpers'
1214

@@ -28,24 +30,21 @@ export type RefetchConfigOptions = {
2830
refetchOnFocus: boolean
2931
}
3032

31-
export type GetNextPageParamFunction<TPageParam, TQueryFnData = unknown> = (
33+
export type GetNextPageParamFunction<TPageParam, TQueryFnData> = (
3234
lastPage: TQueryFnData,
3335
allPages: Array<TQueryFnData>,
3436
lastPageParam: TPageParam,
3537
allPageParams: Array<TPageParam>,
3638
) => TPageParam | undefined | null
3739

38-
export type GetPreviousPageParamFunction<TPageParam, TQueryFnData = unknown> = (
40+
export type GetPreviousPageParamFunction<TPageParam, TQueryFnData> = (
3941
firstPage: TQueryFnData,
4042
allPages: Array<TQueryFnData>,
4143
firstPageParam: TPageParam,
4244
allPageParams: Array<TPageParam>,
4345
) => TPageParam | undefined | null
4446

45-
export type InfiniteQueryConfigOptions<
46-
TQueryFnData = unknown,
47-
TPageParam = unknown,
48-
> = {
47+
export type InfiniteQueryConfigOptions<TQueryFnData, TPageParam> = {
4948
/**
5049
* This function can be set to automatically get the previous cursor for infinite queries.
5150
* The result will also be used to determine the value of `hasPreviousPage`.
@@ -54,7 +53,7 @@ export type InfiniteQueryConfigOptions<
5453
getNextPageParam: GetNextPageParamFunction<TPageParam, TQueryFnData>
5554
}
5655

57-
export interface InfiniteData<TData, TPageParam = unknown> {
56+
export interface InfiniteData<TData, TPageParam> {
5857
pages: Array<TData>
5958
pageParams: Array<TPageParam>
6059
}
@@ -239,15 +238,18 @@ export type QuerySubState<
239238

240239
export type InfiniteQuerySubState<
241240
D extends BaseEndpointDefinition<any, any, any>,
242-
> = QuerySubState<D, InfiniteData<ResultTypeFrom<D>>> & {
243-
// TODO: These shouldn't be optional
244-
hasNextPage?: boolean
245-
hasPreviousPage?: boolean
246-
isFetchingNextPage?: boolean
247-
isFetchingPreviousPage?: boolean
248-
param?: QueryArgFrom<D>
249-
direction?: 'forward' | 'backwards'
250-
}
241+
> =
242+
D extends InfiniteQueryDefinition<any, any, any, any, any>
243+
? QuerySubState<D, InfiniteData<ResultTypeFrom<D>, PageParamFrom<D>>> & {
244+
// TODO: These shouldn't be optional
245+
hasNextPage?: boolean
246+
hasPreviousPage?: boolean
247+
isFetchingNextPage?: boolean
248+
isFetchingPreviousPage?: boolean
249+
param?: PageParamFrom<D>
250+
direction?: 'forward' | 'backwards'
251+
}
252+
: never
251253

252254
type BaseMutationSubState<D extends BaseEndpointDefinition<any, any, any>> = {
253255
requestId: string

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ export type StartInfiniteQueryActionCreatorOptions = {
7070
subscribe?: boolean
7171
forceRefetch?: boolean | number
7272
subscriptionOptions?: SubscriptionOptions
73-
infiniteQueryOptions?: InfiniteQueryConfigOptions
73+
infiniteQueryOptions?: InfiniteQueryConfigOptions<unknown, unknown>
7474
direction?: 'forward' | 'backwards'
7575
[forceQueryFnSymbol]?: () => QueryReturnValue
76-
data?: InfiniteData<unknown>
76+
data?: InfiniteData<unknown, unknown>
7777
param?: unknown
7878
previous?: boolean
7979
}
@@ -112,7 +112,7 @@ export type QueryActionCreatorResult<
112112
}
113113

114114
export type InfiniteQueryActionCreatorResult<
115-
D extends InfiniteQueryDefinition<any, any, any, any>,
115+
D extends InfiniteQueryDefinition<any, any, any, any, any>,
116116
> = Promise<InfiniteQueryResultSelectorResult<D>> & {
117117
arg: QueryArgFrom<D>
118118
requestId: string
@@ -480,7 +480,7 @@ You must add the middleware for RTK-Query to function correctly!`,
480480

481481
function buildInitiateInfiniteQuery(
482482
endpointName: string,
483-
endpointDefinition: InfiniteQueryDefinition<any, any, any, any>,
483+
endpointDefinition: InfiniteQueryDefinition<any, any, any, any, any>,
484484
pages?: number,
485485
) {
486486
const infiniteQueryAction: StartInfiniteQueryActionCreator<any> =

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,14 @@ export type QueryResultSelectorResult<
105105
> = QuerySubState<Definition> & RequestStatusFlags
106106

107107
type InfiniteQueryResultSelectorFactory<
108-
Definition extends InfiniteQueryDefinition<any, any, any, any>,
108+
Definition extends InfiniteQueryDefinition<any, any, any, any, any>,
109109
RootState,
110110
> = (
111111
queryArg: QueryArgFrom<Definition> | SkipToken,
112112
) => (state: RootState) => InfiniteQueryResultSelectorResult<Definition>
113113

114114
export type InfiniteQueryResultSelectorResult<
115-
Definition extends InfiniteQueryDefinition<any, any, any, any>,
115+
Definition extends InfiniteQueryDefinition<any, any, any, any, any>,
116116
> = InfiniteQuerySubState<Definition> & RequestStatusFlags
117117

118118
type MutationResultSelectorFactory<
@@ -215,7 +215,7 @@ export function buildSelectors<
215215
// selector currently is just a clone of Query though
216216
function buildInfiniteQuerySelector(
217217
endpointName: string,
218-
endpointDefinition: InfiniteQueryDefinition<any, any, any, any>,
218+
endpointDefinition: InfiniteQueryDefinition<any, any, any, any, any>,
219219
) {
220220
return ((queryArgs: any) => {
221221
const serializedArgs = serializeQueryArgs({

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ export type InfiniteQueryThunkArg = QuerySubstateIdentifier &
122122
type: `query`
123123
originalArgs: unknown
124124
endpointName: string
125-
data: InfiniteData<unknown>
125+
data: InfiniteData<unknown, unknown>
126126
param: unknown
127127
previous?: boolean
128128
direction?: 'forward' | 'backwards'
@@ -426,7 +426,7 @@ export function buildThunks<
426426
const oldPageParams: any[] = []
427427

428428
const fetchPage = async (
429-
data: InfiniteData<unknown>,
429+
data: InfiniteData<unknown, unknown>,
430430
param: unknown,
431431
previous?: boolean,
432432
): Promise<QueryReturnValue> => {
@@ -480,10 +480,10 @@ export function buildThunks<
480480
// @ts-ignore
481481
const param = getNextPageParam(
482482
endpointDefinition.infiniteQueryOptions,
483-
result.data as InfiniteData<unknown>,
483+
result.data as InfiniteData<unknown, unknown>,
484484
)
485485
result = await fetchPage(
486-
result.data as InfiniteData<unknown>,
486+
result.data as InfiniteData<unknown, unknown>,
487487
param,
488488
)
489489
}
@@ -601,8 +601,8 @@ In the case of an unhandled error, no tags will be "provided" or "invalidated".`
601601
}
602602

603603
function getNextPageParam(
604-
options: InfiniteQueryConfigOptions<any>,
605-
{ pages, pageParams }: InfiniteData<unknown>,
604+
options: InfiniteQueryConfigOptions<unknown, unknown>,
605+
{ pages, pageParams }: InfiniteData<unknown, unknown>,
606606
): unknown | undefined {
607607
const lastIndex = pages.length - 1
608608
return options.getNextPageParam(
@@ -614,8 +614,8 @@ In the case of an unhandled error, no tags will be "provided" or "invalidated".`
614614
}
615615

616616
function getPreviousPageParam(
617-
options: InfiniteQueryConfigOptions<any>,
618-
{ pages, pageParams }: InfiniteData<unknown>,
617+
options: InfiniteQueryConfigOptions<unknown, unknown>,
618+
{ pages, pageParams }: InfiniteData<unknown, unknown>,
619619
): unknown | undefined {
620620
return options.getPreviousPageParam?.(
621621
pages[0],

0 commit comments

Comments
 (0)