Skip to content

Commit 33bd018

Browse files
committed
fix(queryFilters): fetchStatus to queryFilters
1 parent 0e1bb92 commit 33bd018

File tree

6 files changed

+43
-14
lines changed

6 files changed

+43
-14
lines changed

docs/src/pages/guides/filters.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ A query filter object supports the following properties:
3434
- `stale?: boolean`
3535
- When set to `true` it will match stale queries.
3636
- When set to `false` it will match fresh queries.
37-
- `fetching?: boolean`
38-
- When set to `true` it will match queries that are currently fetching.
39-
- When set to `false` it will match queries that are not fetching.
37+
- `fetchStatus?: FetchStatus`
38+
- When set to `fetching` it will match queries that are currently fetching.
39+
- When set to `paused` it will match queries that wanted to fetch, but have been `paused`.
40+
- When set to `idle` it will match queries that are not fetching.
4041
- `predicate?: (query: Query) => boolean`
4142
- This predicate function will be called for every single query in the cache and be expected to return truthy for queries that are `found`.
4243
- `queryKey?: QueryKey`

src/core/query.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,6 @@ export class Query<
256256
return this.observers.some(observer => observer.options.enabled !== false)
257257
}
258258

259-
isFetching(): boolean {
260-
return this.state.fetchStatus === 'fetching'
261-
}
262-
263259
isStale(): boolean {
264260
return (
265261
this.state.isInvalidated ||

src/core/queryClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class QueryClient {
9999
isFetching(queryKey?: QueryKey, filters?: QueryFilters): number
100100
isFetching(arg1?: QueryKey | QueryFilters, arg2?: QueryFilters): number {
101101
const [filters] = parseFilterArgs(arg1, arg2)
102-
filters.fetching = true
102+
filters.fetchStatus = 'fetching'
103103
return this.queryCache.findAll(filters).length
104104
}
105105

src/core/tests/queryCache.test.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ describe('queryCache', () => {
7878
test('should filter correctly', async () => {
7979
const key1 = queryKey()
8080
const key2 = queryKey()
81+
const keyFetching = queryKey()
8182
await queryClient.prefetchQuery(key1, () => 'data1')
8283
await queryClient.prefetchQuery(key2, () => 'data2')
8384
await queryClient.prefetchQuery([{ a: 'a', b: 'b' }], () => 'data3')
@@ -137,6 +138,26 @@ describe('queryCache', () => {
137138
queryCache.findAll({ predicate: query => query === query3 })
138139
).toEqual([query3])
139140
expect(queryCache.findAll(['posts'])).toEqual([query4])
141+
142+
expect(queryCache.findAll({ fetchStatus: 'idle' })).toEqual([
143+
query1,
144+
query2,
145+
query3,
146+
query4,
147+
])
148+
expect(queryCache.findAll(key2, { fetchStatus: undefined })).toEqual([
149+
query2,
150+
])
151+
152+
const promise = queryClient.prefetchQuery(keyFetching, async () => {
153+
await sleep(20)
154+
return 'dataFetching'
155+
})
156+
expect(queryCache.findAll({ fetchStatus: 'fetching' })).toEqual([
157+
queryCache.find(keyFetching),
158+
])
159+
await promise
160+
expect(queryCache.findAll({ fetchStatus: 'fetching' })).toEqual([])
140161
})
141162

142163
test('should return all the queries when no filters are defined', async () => {

src/core/utils.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Mutation } from './mutation'
22
import type { Query } from './query'
33
import type {
4+
FetchStatus,
45
MutationFunction,
56
MutationKey,
67
MutationOptions,
@@ -33,9 +34,9 @@ export interface QueryFilters {
3334
*/
3435
stale?: boolean
3536
/**
36-
* Include or exclude fetching queries
37+
* Include queries matching their fetchStatus
3738
*/
38-
fetching?: boolean
39+
fetchStatus?: FetchStatus
3940
}
4041

4142
export interface MutationFilters {
@@ -164,7 +165,14 @@ export function matchQuery(
164165
filters: QueryFilters,
165166
query: Query<any, any, any, any>
166167
): boolean {
167-
const { type = 'all', exact, fetching, predicate, queryKey, stale } = filters
168+
const {
169+
type = 'all',
170+
exact,
171+
fetchStatus,
172+
predicate,
173+
queryKey,
174+
stale,
175+
} = filters
168176

169177
if (isQueryKey(queryKey)) {
170178
if (exact) {
@@ -190,7 +198,10 @@ export function matchQuery(
190198
return false
191199
}
192200

193-
if (typeof fetching === 'boolean' && query.isFetching() !== fetching) {
201+
if (
202+
typeof fetchStatus !== 'undefined' &&
203+
fetchStatus !== query.state.fetchStatus
204+
) {
194205
return false
195206
}
196207

src/devtools/tests/devtools.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ describe('ReactQueryDevtools', () => {
127127

128128
// When the query is fetching then expect number of
129129
// fetching queries to be 1
130-
expect(currentQuery?.isFetching()).toEqual(true)
130+
expect(currentQuery?.state.fetchStatus).toEqual('fetching')
131131
await screen.findByText(
132132
getByTextContent(
133133
'fresh (0) fetching (1) paused (0) stale (0) inactive (0)'
@@ -138,7 +138,7 @@ describe('ReactQueryDevtools', () => {
138138
// until 300ms after, so expect the number of fresh
139139
// queries to be 1
140140
await waitFor(() => {
141-
expect(currentQuery?.isFetching()).toEqual(false)
141+
expect(currentQuery?.state.fetchStatus).toEqual('idle')
142142
})
143143
await screen.findByText(
144144
getByTextContent(

0 commit comments

Comments
 (0)