@@ -34,15 +34,16 @@ interface QueryConfig<TData, TError, TQueryFnData> {
34
34
export interface QueryState < TData = unknown , TError = unknown > {
35
35
data : TData | undefined
36
36
dataUpdateCount : number
37
+ dataUpdatedAt : number
37
38
error : TError | null
38
39
errorUpdateCount : number
39
- failureCount : number
40
+ errorUpdatedAt : number
41
+ fetchFailureCount : number
40
42
fetchMeta : any
41
43
isFetching : boolean
42
44
isInvalidated : boolean
43
45
isPaused : boolean
44
46
status : QueryStatus
45
- updatedAt : number
46
47
}
47
48
48
49
export interface FetchContext < TData , TError , TQueryFnData > {
@@ -232,51 +233,35 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
232
233
isStale ( ) : boolean {
233
234
return (
234
235
this . state . isInvalidated ||
235
- ! this . state . updatedAt ||
236
+ ! this . state . dataUpdatedAt ||
236
237
this . observers . some ( observer => observer . getCurrentResult ( ) . isStale )
237
238
)
238
239
}
239
240
240
241
isStaleByTime ( staleTime = 0 ) : boolean {
241
242
return (
242
243
this . state . isInvalidated ||
243
- ! this . state . updatedAt ||
244
- ! timeUntilStale ( this . state . updatedAt , staleTime )
244
+ ! this . state . dataUpdatedAt ||
245
+ ! timeUntilStale ( this . state . dataUpdatedAt , staleTime )
245
246
)
246
247
}
247
248
248
249
onFocus ( ) : void {
249
- this . onExternalEvent ( 'focus' )
250
- }
250
+ const observer = this . observers . find ( x => x . willFetchOnWindowFocus ( ) )
251
251
252
- onOnline ( ) : void {
253
- this . onExternalEvent ( 'online' )
252
+ if ( observer ) {
253
+ observer . refetch ( )
254
+ }
255
+
256
+ // Continue fetch if currently paused
257
+ this . retryer ?. continue ( )
254
258
}
255
259
256
- private onExternalEvent ( type : 'focus' | 'online' ) : void {
257
- // Execute the first observer that wants to fetch on this event
258
- const fetchObserver = this . observers . find ( observer => {
259
- const {
260
- enabled,
261
- refetchOnWindowFocus,
262
- refetchOnReconnect,
263
- } = observer . options
264
-
265
- const { isStale } = observer . getCurrentResult ( )
266
-
267
- return (
268
- enabled !== false &&
269
- ( ( type === 'focus' &&
270
- ( refetchOnWindowFocus === 'always' ||
271
- ( refetchOnWindowFocus !== false && isStale ) ) ) ||
272
- ( type === 'online' &&
273
- ( refetchOnReconnect === 'always' ||
274
- ( refetchOnReconnect !== false && isStale ) ) ) )
275
- )
276
- } )
260
+ onOnline ( ) : void {
261
+ const observer = this . observers . find ( x => x . willFetchOnReconnect ( ) )
277
262
278
- if ( fetchObserver ) {
279
- fetchObserver . refetch ( )
263
+ if ( observer ) {
264
+ observer . refetch ( )
280
265
}
281
266
282
267
// Continue fetch if currently paused
@@ -331,7 +316,7 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
331
316
fetchOptions ?: FetchOptions
332
317
) : Promise < TData > {
333
318
if ( this . state . isFetching )
334
- if ( this . state . updatedAt && fetchOptions ?. cancelRefetch ) {
319
+ if ( this . state . dataUpdatedAt && fetchOptions ?. cancelRefetch ) {
335
320
// Silently cancel current fetch if the user wants to cancel refetches
336
321
this . cancel ( { silent : true } )
337
322
} else if ( this . promise ) {
@@ -450,15 +435,16 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
450
435
return {
451
436
data,
452
437
dataUpdateCount : 0 ,
438
+ dataUpdatedAt : hasData ? Date . now ( ) : 0 ,
453
439
error : null ,
454
440
errorUpdateCount : 0 ,
455
- failureCount : 0 ,
441
+ errorUpdatedAt : 0 ,
442
+ fetchFailureCount : 0 ,
456
443
fetchMeta : undefined ,
457
444
isFetching : false ,
458
445
isInvalidated : false ,
459
446
isPaused : false ,
460
447
status : hasData ? 'success' : 'idle' ,
461
- updatedAt : hasData ? Date . now ( ) : 0 ,
462
448
}
463
449
}
464
450
@@ -470,7 +456,7 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
470
456
case 'failed' :
471
457
return {
472
458
...state ,
473
- failureCount : state . failureCount + 1 ,
459
+ fetchFailureCount : state . fetchFailureCount + 1 ,
474
460
}
475
461
case 'pause' :
476
462
return {
@@ -485,7 +471,7 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
485
471
case 'fetch' :
486
472
return {
487
473
...state ,
488
- failureCount : 0 ,
474
+ fetchFailureCount : 0 ,
489
475
fetchMeta : action . meta ,
490
476
isFetching : true ,
491
477
isPaused : false ,
@@ -496,21 +482,21 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
496
482
...state ,
497
483
data : action . data ,
498
484
dataUpdateCount : state . dataUpdateCount + 1 ,
485
+ dataUpdatedAt : action . updatedAt ?? Date . now ( ) ,
499
486
error : null ,
500
- failureCount : 0 ,
487
+ fetchFailureCount : 0 ,
501
488
isFetching : false ,
502
489
isInvalidated : false ,
503
490
isPaused : false ,
504
491
status : 'success' ,
505
- updatedAt : action . updatedAt ?? Date . now ( ) ,
506
492
}
507
493
case 'error' :
508
494
const error = action . error as unknown
509
495
510
496
if ( isCancelledError ( error ) && error . revert ) {
511
497
return {
512
498
...state ,
513
- failureCount : 0 ,
499
+ fetchFailureCount : 0 ,
514
500
isFetching : false ,
515
501
isPaused : false ,
516
502
status : state . status === 'loading' ? 'idle' : state . status ,
@@ -521,7 +507,8 @@ export class Query<TData = unknown, TError = unknown, TQueryFnData = TData> {
521
507
...state ,
522
508
error : error as TError ,
523
509
errorUpdateCount : state . errorUpdateCount + 1 ,
524
- failureCount : state . failureCount + 1 ,
510
+ errorUpdatedAt : Date . now ( ) ,
511
+ fetchFailureCount : state . fetchFailureCount + 1 ,
525
512
isFetching : false ,
526
513
isPaused : false ,
527
514
status : 'error' ,
0 commit comments