@@ -12,6 +12,12 @@ import {
1212 getHasError ,
1313 useClearResetErrorBoundary ,
1414} from './errorBoundaryUtils'
15+ import {
16+ ensureStaleTime ,
17+ shouldSuspend ,
18+ fetchOptimistic ,
19+ willFetch ,
20+ } from './suspense'
1521
1622// This defines the `UseQueryOptions` that are accepted in `QueriesOptions` & `GetOptions`.
1723// - `context` is omitted as it is passed as a root-level option to `useQueries` instead.
@@ -170,7 +176,7 @@ export function useQueries<T extends any[]>({
170176 ( ) => new QueriesObserver ( queryClient , defaultedQueries ) ,
171177 )
172178
173- const result = observer . getOptimisticResult ( defaultedQueries )
179+ const optimisticResult = observer . getOptimisticResult ( defaultedQueries )
174180
175181 useSyncExternalStore (
176182 React . useCallback (
@@ -194,22 +200,48 @@ export function useQueries<T extends any[]>({
194200
195201 defaultedQueries . forEach ( ( query ) => {
196202 ensurePreventErrorBoundaryRetry ( query , errorResetBoundary )
203+ ensureStaleTime ( query )
197204 } )
198205
199206 useClearResetErrorBoundary ( errorResetBoundary )
200207
201- const firstSingleResultWhichShouldThrow = result . find ( ( singleResult , index ) =>
202- getHasError ( {
203- result : singleResult ,
204- errorResetBoundary,
205- useErrorBoundary : defaultedQueries [ index ] ?. useErrorBoundary ?? false ,
206- query : observer . getQueries ( ) [ index ] ! ,
207- } ) ,
208+ const shouldAtLeastOneSuspend = optimisticResult . some ( ( result , index ) =>
209+ shouldSuspend ( defaultedQueries [ index ] , result , isRestoring ) ,
210+ )
211+
212+ const suspensePromises = shouldAtLeastOneSuspend
213+ ? optimisticResult . flatMap ( ( result , index ) => {
214+ const options = defaultedQueries [ index ]
215+ const queryObserver = observer . getObservers ( ) [ index ]
216+
217+ if ( options && queryObserver ) {
218+ if ( shouldSuspend ( options , result , isRestoring ) ) {
219+ return fetchOptimistic ( options , queryObserver , errorResetBoundary )
220+ } else if ( willFetch ( result , isRestoring ) ) {
221+ void fetchOptimistic ( options , queryObserver , errorResetBoundary )
222+ }
223+ }
224+ return [ ]
225+ } )
226+ : [ ]
227+
228+ if ( suspensePromises . length > 0 ) {
229+ throw Promise . all ( suspensePromises )
230+ }
231+
232+ const firstSingleResultWhichShouldThrow = optimisticResult . find (
233+ ( result , index ) =>
234+ getHasError ( {
235+ result,
236+ errorResetBoundary,
237+ useErrorBoundary : defaultedQueries [ index ] ?. useErrorBoundary ?? false ,
238+ query : observer . getQueries ( ) [ index ] ! ,
239+ } ) ,
208240 )
209241
210242 if ( firstSingleResultWhichShouldThrow ?. error ) {
211243 throw firstSingleResultWhichShouldThrow . error
212244 }
213245
214- return result as QueriesResults < T >
246+ return optimisticResult as QueriesResults < T >
215247}
0 commit comments