1- import type { QueryClientConfig } from '@tanstack/react-query' ;
1+ import type { InvalidateQueryFilters , QueryClientConfig } from '@tanstack/react-query' ;
22import { QueryClient } from '@tanstack/react-query' ;
33
44import {
99 composeFullKey ,
1010 hasTag ,
1111} from '../core' ;
12+ import type { InvalidateOptions , InvalidateRepeatOptions } from '../core/types/DataManagerOptions' ;
1213
1314export type ClientDataManagerConfig = QueryClientConfig ;
1415
@@ -32,23 +33,35 @@ export class ClientDataManager implements DataManager {
3233 } ) ;
3334 }
3435
35- invalidateTag ( tag : DataSourceTag ) {
36- return this . queryClient . invalidateQueries ( {
37- predicate : ( { queryKey} ) => hasTag ( queryKey , tag ) ,
38- } ) ;
36+ invalidateTag ( tag : DataSourceTag , invalidateOptions ?: InvalidateOptions ) {
37+ return this . invalidateQueries (
38+ {
39+ predicate : ( { queryKey} ) => hasTag ( queryKey , tag ) ,
40+ } ,
41+ invalidateOptions ,
42+ ) ;
3943 }
4044
41- invalidateTags ( tags : DataSourceTag [ ] ) {
42- return this . queryClient . invalidateQueries ( {
43- predicate : ( { queryKey} ) => tags . every ( ( tag ) => hasTag ( queryKey , tag ) ) ,
44- } ) ;
45+ invalidateTags ( tags : DataSourceTag [ ] , invalidateOptions ?: InvalidateOptions ) {
46+ return this . invalidateQueries (
47+ {
48+ predicate : ( { queryKey} ) => tags . every ( ( tag ) => hasTag ( queryKey , tag ) ) ,
49+ } ,
50+ invalidateOptions ,
51+ ) ;
4552 }
4653
47- invalidateSource < TDataSource extends AnyDataSource > ( dataSource : TDataSource ) {
48- return this . queryClient . invalidateQueries ( {
49- // First element is a data source name
50- queryKey : [ dataSource . name ] ,
51- } ) ;
54+ invalidateSource < TDataSource extends AnyDataSource > (
55+ dataSource : TDataSource ,
56+ invalidateOptions ?: InvalidateOptions ,
57+ ) {
58+ return this . invalidateQueries (
59+ {
60+ // First element is a data source name
61+ queryKey : [ dataSource . name ] ,
62+ } ,
63+ invalidateOptions ,
64+ ) ;
5265 }
5366
5467 resetSource < TDataSource extends AnyDataSource > ( dataSource : TDataSource ) {
@@ -61,11 +74,15 @@ export class ClientDataManager implements DataManager {
6174 invalidateParams < TDataSource extends AnyDataSource > (
6275 dataSource : TDataSource ,
6376 params : DataSourceParams < TDataSource > ,
77+ invalidateOptions ?: InvalidateOptions ,
6478 ) {
65- return this . queryClient . invalidateQueries ( {
66- queryKey : composeFullKey ( dataSource , params ) ,
67- exact : true ,
68- } ) ;
79+ return this . invalidateQueries (
80+ {
81+ queryKey : composeFullKey ( dataSource , params ) ,
82+ exact : true ,
83+ } ,
84+ invalidateOptions ,
85+ ) ;
6986 }
7087
7188 resetParams < TDataSource extends AnyDataSource > (
@@ -81,10 +98,38 @@ export class ClientDataManager implements DataManager {
8198 invalidateSourceTags < TDataSource extends AnyDataSource > (
8299 dataSource : TDataSource ,
83100 params : DataSourceParams < TDataSource > ,
101+ invalidateOptions ?: InvalidateOptions ,
84102 ) {
85- return this . queryClient . invalidateQueries ( {
86- // Last element is a full key
87- queryKey : composeFullKey ( dataSource , params ) . slice ( 0 , - 1 ) ,
88- } ) ;
103+ return this . invalidateQueries (
104+ {
105+ // Last element is a full key
106+ queryKey : composeFullKey ( dataSource , params ) . slice ( 0 , - 1 ) ,
107+ } ,
108+ invalidateOptions ,
109+ ) ;
110+ }
111+
112+ private invalidateQueries (
113+ filters : InvalidateQueryFilters ,
114+ invalidateOptions ?: InvalidateOptions ,
115+ ) {
116+ const { repeat} = invalidateOptions || { } ;
117+
118+ const invalidate = ( ) => this . queryClient . invalidateQueries ( filters ) ;
119+
120+ this . repeatInvalidate ( invalidate , repeat ) ;
121+
122+ return invalidate ( ) ;
123+ }
124+
125+ private repeatInvalidate ( invalidate : ( ) => Promise < void > , repeat ?: InvalidateRepeatOptions ) {
126+ if ( ! repeat ) {
127+ return ;
128+ }
129+ const { interval, count} = repeat ;
130+
131+ for ( let i = 1 ; i <= count ; i ++ ) {
132+ setTimeout ( invalidate , interval * i ) ;
133+ }
89134 }
90135}
0 commit comments