Skip to content

Commit 56a3e12

Browse files
committed
feat(infiniteQuery): add possibility to decide which pages should be refetched
move refetchPage into queryFilters
1 parent 701a1b4 commit 56a3e12

File tree

7 files changed

+65
-53
lines changed

7 files changed

+65
-53
lines changed

docs/src/pages/guides/infinite-queries.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ const { refetch } = useInfiniteQuery('projects', fetchProjects, {
108108
refetch({ refetchPage: (page, index) => index === 0 })
109109
```
110110

111-
You can also pass this function as part of the 3rd argument (`options`) to [queryClient.refetchQueries](/reference/QueryClient#queryclientrefetchqueries), [queryClient.invalidateQueries](/reference/QueryClient#queryclientinvalidatequeries) or [queryClient.resetQueries](/reference/QueryClient#queryclientresetqueries).
111+
You can also pass this function as part of the 2nd argument (`queryFilters`) to [queryClient.refetchQueries](/reference/QueryClient#queryclientrefetchqueries), [queryClient.invalidateQueries](/reference/QueryClient#queryclientinvalidatequeries) or [queryClient.resetQueries](/reference/QueryClient#queryclientresetqueries).
112112

113113
**Signature**
114114

docs/src/pages/reference/QueryClient.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -287,12 +287,12 @@ await queryClient.invalidateQueries('posts', {
287287
- `refetchInactive: Boolean`
288288
- Defaults to `false`
289289
- When set to `true`, queries that match the refetch predicate and are not being rendered via `useQuery` and friends will be both marked as invalid and also refetched in the background
290-
- `refetchOptions?: RefetchOptions`:
291-
- `throwOnError?: boolean`
292-
- When set to `true`, this method will throw if any of the query refetch tasks fail.
293290
- `refetchPage: (page: TData, index: number, allPages: TData[]) => boolean`
294291
- Only for [Infinite Queries](../guides/infinite-queries#refetchpage)
295292
- Use this function to specify which pages should be refetched
293+
- `refetchOptions?: RefetchOptions`:
294+
- `throwOnError?: boolean`
295+
- When set to `true`, this method will throw if any of the query refetch tasks fail.
296296

297297
## `queryClient.refetchQueries`
298298

@@ -318,12 +318,12 @@ await queryClient.refetchQueries(['posts', 1], { active: true, exact: true })
318318

319319
- `queryKey?: QueryKey`: [Query Keys](../guides/query-keys)
320320
- `filters?: QueryFilters`: [Query Filters](../guides/filters#query-filters)
321-
- `refetchOptions?: RefetchOptions`:
322-
- `throwOnError?: boolean`
323-
- When set to `true`, this method will throw if any of the query refetch tasks fail.
324321
- `refetchPage: (page: TData, index: number, allPages: TData[]) => boolean`
325322
- Only for [Infinite Queries](../guides/infinite-queries#refetchpage)
326323
- Use this function to specify which pages should be refetched
324+
- `refetchOptions?: RefetchOptions`:
325+
- `throwOnError?: boolean`
326+
- When set to `true`, this method will throw if any of the query refetch tasks fail.
327327

328328
**Returns**
329329

@@ -384,12 +384,12 @@ queryClient.resetQueries(queryKey, { exact: true })
384384

385385
- `queryKey?: QueryKey`: [Query Keys](../guides/query-keys)
386386
- `filters?: QueryFilters`: [Query Filters](../guides/filters#query-filters)
387-
- `resetOptions?: ResetOptions`:
388-
- `throwOnError?: boolean`
389-
- When set to `true`, this method will throw if any of the query refetch tasks fail.
390387
- `refetchPage: (page: TData, index: number, allPages: TData[]) => boolean`
391388
- Only for [Infinite Queries](../guides/infinite-queries#refetchpage)
392389
- Use this function to specify which pages should be refetched
390+
- `resetOptions?: ResetOptions`:
391+
- `throwOnError?: boolean`
392+
- When set to `true`, this method will throw if any of the query refetch tasks fail.
393393

394394
**Returns**
395395

src/core/infiniteQueryBehavior.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type {
44
InfiniteData,
55
QueryFunctionContext,
66
QueryOptions,
7-
RefetchPageOptions,
7+
RefetchQueryFilters,
88
} from './types'
99

1010
export function infiniteQueryBehavior<
@@ -15,7 +15,7 @@ export function infiniteQueryBehavior<
1515
return {
1616
onFetch: context => {
1717
context.fetchFn = () => {
18-
const refetchPage: RefetchPageOptions['refetchPage'] | undefined =
18+
const refetchPage: RefetchQueryFilters['refetchPage'] | undefined =
1919
context.fetchOptions?.meta?.refetchPage
2020
const fetchMore = context.fetchOptions?.meta?.fetchMore
2121
const pageParam = fetchMore?.pageParam

src/core/queryClient.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import type {
2424
QueryObserverOptions,
2525
QueryOptions,
2626
RefetchOptions,
27+
RefetchQueryFilters,
2728
ResetOptions,
29+
ResetQueryFilters,
2830
} from './types'
2931
import type { QueryState, SetDataOptions } from './query'
3032
import { QueryCache } from './queryCache'
@@ -182,21 +184,24 @@ export class QueryClient {
182184
})
183185
}
184186

185-
resetQueries(filters?: QueryFilters, options?: ResetOptions): Promise<void>
187+
resetQueries(
188+
filters?: ResetQueryFilters,
189+
options?: ResetOptions
190+
): Promise<void>
186191
resetQueries(
187192
queryKey?: QueryKey,
188-
filters?: QueryFilters,
193+
filters?: ResetQueryFilters,
189194
options?: ResetOptions
190195
): Promise<void>
191196
resetQueries(
192-
arg1?: QueryKey | QueryFilters,
193-
arg2?: QueryFilters | ResetOptions,
197+
arg1?: QueryKey | ResetQueryFilters,
198+
arg2?: ResetQueryFilters | ResetOptions,
194199
arg3?: ResetOptions
195200
): Promise<void> {
196201
const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
197202
const queryCache = this.queryCache
198203

199-
const refetchFilters: QueryFilters = {
204+
const refetchFilters: RefetchQueryFilters = {
200205
...filters,
201206
active: true,
202207
}
@@ -249,7 +254,7 @@ export class QueryClient {
249254
): Promise<void> {
250255
const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
251256

252-
const refetchFilters: QueryFilters = {
257+
const refetchFilters: RefetchQueryFilters = {
253258
...filters,
254259
// if filters.refetchActive is not provided and filters.active is explicitly false,
255260
// e.g. invalidateQueries({ active: false }), we don't want to refetch active queries
@@ -266,25 +271,25 @@ export class QueryClient {
266271
}
267272

268273
refetchQueries(
269-
filters?: QueryFilters,
274+
filters?: RefetchQueryFilters,
270275
options?: RefetchOptions
271276
): Promise<void>
272277
refetchQueries(
273278
queryKey?: QueryKey,
274-
filters?: QueryFilters,
279+
filters?: RefetchQueryFilters,
275280
options?: RefetchOptions
276281
): Promise<void>
277282
refetchQueries(
278-
arg1?: QueryKey | QueryFilters,
279-
arg2?: QueryFilters | RefetchOptions,
283+
arg1?: QueryKey | RefetchQueryFilters,
284+
arg2?: RefetchQueryFilters | RefetchOptions,
280285
arg3?: RefetchOptions
281286
): Promise<void> {
282287
const [filters, options] = parseFilterArgs(arg1, arg2, arg3)
283288

284289
const promises = notifyManager.batch(() =>
285290
this.queryCache.findAll(filters).map(query =>
286291
query.fetch(undefined, {
287-
meta: { refetchPage: options?.refetchPage },
292+
meta: { refetchPage: filters?.refetchPage },
288293
})
289294
)
290295
)

src/core/queryObserver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { RefetchQueryFilters } from './types'
12
import {
23
isServer,
34
isValidTimeout,
@@ -275,7 +276,7 @@ export class QueryObserver<
275276
}
276277

277278
refetch(
278-
options?: RefetchOptions<TData>
279+
options?: RefetchOptions & RefetchQueryFilters<TData>
279280
): Promise<QueryObserverResult<TData, TError>> {
280281
return this.fetch({
281282
...options,

src/core/tests/queryClient.test.tsx

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -944,10 +944,10 @@ describe('queryClient', () => {
944944

945945
multiplier = 2
946946

947-
await queryClient.refetchQueries(
948-
{ queryKey: key },
949-
{ refetchPage: (_, index) => index === 0 }
950-
)
947+
await queryClient.refetchQueries({
948+
queryKey: key,
949+
refetchPage: (_, index) => index === 0,
950+
})
951951

952952
expect(queryClient.getQueryData(key)).toMatchObject({
953953
pages: [20, 11],
@@ -971,14 +971,13 @@ describe('queryClient', () => {
971971

972972
multiplier = 2
973973

974-
await queryClient.invalidateQueries(
975-
{ queryKey: key, refetchInactive: true },
976-
{
977-
refetchPage: (page, _, allPages) => {
978-
return page === allPages[0]
979-
},
980-
}
981-
)
974+
await queryClient.invalidateQueries({
975+
queryKey: key,
976+
refetchInactive: true,
977+
refetchPage: (page, _, allPages) => {
978+
return page === allPages[0]
979+
},
980+
})
982981

983982
expect(queryClient.getQueryData(key)).toMatchObject({
984983
pages: [20, 11],
@@ -1004,14 +1003,13 @@ describe('queryClient', () => {
10041003

10051004
multiplier = 2
10061005

1007-
await queryClient.resetQueries(
1008-
{ queryKey: key, inactive: true },
1009-
{
1010-
refetchPage: (page, _, allPages) => {
1011-
return page === allPages[0]
1012-
},
1013-
}
1014-
)
1006+
await queryClient.resetQueries({
1007+
queryKey: key,
1008+
inactive: true,
1009+
refetchPage: (page, _, allPages) => {
1010+
return page === allPages[0]
1011+
},
1012+
})
10151013

10161014
expect(queryClient.getQueryData(key)).toMatchObject({
10171015
pages: [20, 11],

src/core/types.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -236,30 +236,38 @@ export interface ResultOptions {
236236
throwOnError?: boolean
237237
}
238238

239-
export interface RefetchPageOptions<TQueryFnData = unknown> {
240-
refetchPage: (
239+
export interface RefetchPageFilters<TQueryFnData = unknown> {
240+
refetchPage?: (
241241
lastPage: TQueryFnData,
242242
index: number,
243243
allPages: TQueryFnData[]
244244
) => boolean
245245
}
246246

247-
export interface RefetchOptions<TQueryFnData = unknown>
248-
extends ResultOptions,
249-
RefetchPageOptions<TQueryFnData> {
247+
export interface RefetchOptions extends ResultOptions {
250248
cancelRefetch?: boolean
251249
}
252250

253-
export interface InvalidateQueryFilters extends QueryFilters {
251+
export interface InvalidateQueryFilters<TQueryFnData = unknown>
252+
extends QueryFilters,
253+
RefetchPageFilters<TQueryFnData> {
254254
refetchActive?: boolean
255255
refetchInactive?: boolean
256256
}
257257

258-
export interface InvalidateOptions extends RefetchPageOptions {
258+
export interface RefetchQueryFilters<TQueryFnData = unknown>
259+
extends QueryFilters,
260+
RefetchPageFilters<TQueryFnData> {}
261+
262+
export interface ResetQueryFilters<TQueryFnData = unknown>
263+
extends QueryFilters,
264+
RefetchPageFilters<TQueryFnData> {}
265+
266+
export interface InvalidateOptions {
259267
throwOnError?: boolean
260268
}
261269

262-
export interface ResetOptions extends RefetchPageOptions {
270+
export interface ResetOptions {
263271
throwOnError?: boolean
264272
}
265273

@@ -292,7 +300,7 @@ export interface QueryObserverBaseResult<TData = unknown, TError = unknown> {
292300
isStale: boolean
293301
isSuccess: boolean
294302
refetch: (
295-
options?: RefetchOptions<TData>
303+
options?: RefetchOptions & RefetchQueryFilters<TData>
296304
) => Promise<QueryObserverResult<TData, TError>>
297305
remove: () => void
298306
status: QueryStatus

0 commit comments

Comments
 (0)