@@ -2,7 +2,7 @@ import { difference, getQueryKeyHashFn, replaceAt } from './utils'
22import { notifyManager } from './notifyManager'
33import type { QueryObserverOptions , QueryObserverResult } from './types'
44import type { QueryClient } from './queryClient'
5- import { QueryObserver } from './queryObserver'
5+ import { NotifyOptions , QueryObserver } from './queryObserver'
66import { Subscribable } from './subscribable'
77
88type QueriesObserverListener = ( result : QueryObserverResult [ ] ) => void
@@ -20,9 +20,7 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
2020 this . queries = queries || [ ]
2121 this . result = [ ]
2222 this . observers = [ ]
23-
24- // Subscribe to queries
25- this . updateObservers ( )
23+ this . setQueries ( this . queries )
2624 }
2725
2826 protected onSubscribe ( ) : void {
@@ -48,21 +46,21 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
4846 } )
4947 }
5048
51- setQueries ( queries : QueryObserverOptions [ ] ) : void {
49+ setQueries (
50+ queries : QueryObserverOptions [ ] ,
51+ notifyOptions ?: NotifyOptions
52+ ) : void {
5253 this . queries = queries
53- this . updateObservers ( )
54+ this . updateObservers ( notifyOptions )
5455 }
5556
5657 getCurrentResult ( ) : QueryObserverResult [ ] {
5758 return this . result
5859 }
5960
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 ]
6664
6765 const defaultedOptions = this . client . defaultQueryObserverOptions ( options )
6866 const hashFn = getQueryKeyHashFn ( defaultedOptions )
@@ -72,42 +70,74 @@ export class QueriesObserver extends Subscribable<QueriesObserverListener> {
7270 ! observer ||
7371 observer . getCurrentQuery ( ) . queryHash !== defaultedOptions . queryHash
7472 ) {
75- hasIndexChange = true
76- observer = prevObservers . find (
73+ observer = this . observers . find (
7774 x => x . getCurrentQuery ( ) . queryHash === defaultedOptions . queryHash
7875 )
7976 }
8077
81- if ( observer ) {
82- observer . setOptions ( defaultedOptions )
83- return observer
78+ if ( ! observer ) {
79+ observer = new QueryObserver ( this . client , defaultedOptions )
8480 }
8581
86- return new QueryObserver ( this . client , defaultedOptions )
82+ return observer . getOptimisticResult ( defaultedOptions )
8783 } )
84+ }
8885
89- if ( prevObservers . length === newObservers . length && ! hasIndexChange ) {
90- return
91- }
86+ private updateObservers ( notifyOptions ?: NotifyOptions ) : void {
87+ notifyManager . batch ( ( ) => {
88+ let hasIndexChange = false
9289
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 ]
9593
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+ } )
99117
100- difference ( prevObservers , newObservers ) . forEach ( observer => {
101- observer . destroy ( )
102- } )
118+ if ( prevObservers . length === newObservers . length && ! hasIndexChange ) {
119+ return
120+ }
103121
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 ( )
107131 } )
108- } )
109132
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+ } )
111141 }
112142
113143 private onUpdate ( observer : QueryObserver , result : QueryObserverResult ) : void {
0 commit comments