@@ -2,7 +2,7 @@ import { difference, getQueryKeyHashFn, replaceAt } from './utils'
2
2
import { notifyManager } from './notifyManager'
3
3
import type { QueryObserverOptions , QueryObserverResult } from './types'
4
4
import type { QueryClient } from './queryClient'
5
- import { QueryObserver } from './queryObserver'
5
+ import { NotifyOptions , QueryObserver } from './queryObserver'
6
6
import { Subscribable } from './subscribable'
7
7
8
8
type QueriesObserverListener = ( result : QueryObserverResult [ ] ) => void
@@ -20,9 +20,7 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
20
20
this . queries = queries || [ ]
21
21
this . result = [ ]
22
22
this . observers = [ ]
23
-
24
- // Subscribe to queries
25
- this . updateObservers ( )
23
+ this . setQueries ( this . queries )
26
24
}
27
25
28
26
protected onSubscribe ( ) : void {
@@ -48,21 +46,21 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
48
46
} )
49
47
}
50
48
51
- setQueries ( queries : QueryObserverOptions [ ] ) : void {
49
+ setQueries (
50
+ queries : QueryObserverOptions [ ] ,
51
+ notifyOptions ?: NotifyOptions
52
+ ) : void {
52
53
this . queries = queries
53
- this . updateObservers ( )
54
+ this . updateObservers ( notifyOptions )
54
55
}
55
56
56
57
getCurrentResult ( ) : QueryObserverResult [ ] {
57
58
return this . result
58
59
}
59
60
60
- private updateObservers ( ) : void {
61
- let hasIndexChange = false
62
-
63
- const prevObservers = this . observers
64
- const newObservers = this . queries . map ( ( options , i ) => {
65
- let observer : QueryObserver | undefined = prevObservers [ i ]
61
+ getOptimisticResult ( queries : QueryObserverOptions [ ] ) : QueryObserverResult [ ] {
62
+ return queries . map ( ( options , i ) => {
63
+ let observer : QueryObserver | undefined = this . observers [ i ]
66
64
67
65
const defaultedOptions = this . client . defaultQueryObserverOptions ( options )
68
66
const hashFn = getQueryKeyHashFn ( defaultedOptions )
@@ -72,42 +70,74 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
72
70
! observer ||
73
71
observer . getCurrentQuery ( ) . queryHash !== defaultedOptions . queryHash
74
72
) {
75
- hasIndexChange = true
76
- observer = prevObservers . find (
73
+ observer = this . observers . find (
77
74
x => x . getCurrentQuery ( ) . queryHash === defaultedOptions . queryHash
78
75
)
79
76
}
80
77
81
- if ( observer ) {
82
- observer . setOptions ( defaultedOptions )
83
- return observer
78
+ if ( ! observer ) {
79
+ observer = new QueryObserver ( this . client , defaultedOptions )
84
80
}
85
81
86
- return new QueryObserver ( this . client , defaultedOptions )
82
+ return observer . getOptimisticResult ( defaultedOptions )
87
83
} )
84
+ }
88
85
89
- if ( prevObservers . length === newObservers . length && ! hasIndexChange ) {
90
- return
91
- }
86
+ private updateObservers ( notifyOptions ?: NotifyOptions ) : void {
87
+ notifyManager . batch ( ( ) => {
88
+ let hasIndexChange = false
92
89
93
- this . observers = newObservers
94
- this . result = newObservers . map ( observer => observer . getCurrentResult ( ) )
90
+ const prevObservers = this . observers
91
+ const newObservers = this . queries . map ( ( options , i ) => {
92
+ let observer : QueryObserver | undefined = prevObservers [ i ]
95
93
96
- if ( ! this . listeners . length ) {
97
- return
98
- }
94
+ const defaultedOptions = this . client . defaultQueryObserverOptions (
95
+ options
96
+ )
97
+ const hashFn = getQueryKeyHashFn ( defaultedOptions )
98
+ defaultedOptions . queryHash = hashFn ( defaultedOptions . queryKey ! )
99
+
100
+ if (
101
+ ! observer ||
102
+ observer . getCurrentQuery ( ) . queryHash !== defaultedOptions . queryHash
103
+ ) {
104
+ hasIndexChange = true
105
+ observer = prevObservers . find (
106
+ x => x . getCurrentQuery ( ) . queryHash === defaultedOptions . queryHash
107
+ )
108
+ }
109
+
110
+ if ( observer ) {
111
+ observer . setOptions ( defaultedOptions , notifyOptions )
112
+ return observer
113
+ }
114
+
115
+ return new QueryObserver ( this . client , defaultedOptions )
116
+ } )
99
117
100
- difference ( prevObservers , newObservers ) . forEach ( observer => {
101
- observer . destroy ( )
102
- } )
118
+ if ( prevObservers . length === newObservers . length && ! hasIndexChange ) {
119
+ return
120
+ }
103
121
104
- difference ( newObservers , prevObservers ) . forEach ( observer => {
105
- observer . subscribe ( result => {
106
- this . onUpdate ( observer , result )
122
+ this . observers = newObservers
123
+ this . result = newObservers . map ( observer => observer . getCurrentResult ( ) )
124
+
125
+ if ( ! this . listeners . length ) {
126
+ return
127
+ }
128
+
129
+ difference ( prevObservers , newObservers ) . forEach ( observer => {
130
+ observer . destroy ( )
107
131
} )
108
- } )
109
132
110
- this . notify ( )
133
+ difference ( newObservers , prevObservers ) . forEach ( observer => {
134
+ observer . subscribe ( result => {
135
+ this . onUpdate ( observer , result )
136
+ } )
137
+ } )
138
+
139
+ this . notify ( )
140
+ } )
111
141
}
112
142
113
143
private onUpdate ( observer : QueryObserver , result : QueryObserverResult ) : void {
0 commit comments