11import { type CompilableQuery , parseQuery } from '@powersync/common' ;
2- import { usePowerSync } from '@powersync/react' ;
2+ import { QuerySyncStreamOptions , useAllSyncStreamsHaveSynced , usePowerSync } from '@powersync/react' ;
33import { useEffect , useState , useCallback , useMemo } from 'react' ;
44import * as Tanstack from '@tanstack/react-query' ;
55
66export type UsePowerSyncQueriesInput = {
77 query ?: string | CompilableQuery < unknown > ;
88 parameters ?: unknown [ ] ;
99 queryKey : Tanstack . QueryKey ;
10+ streams ?: QuerySyncStreamOptions [ ] ;
1011} [ ] ;
1112
1213export type UsePowerSyncQueriesOutput = {
13- sqlStatement : string ;
14- queryParameters : unknown [ ] ;
15- tables : string [ ] ;
16- error ?: Error ;
17- queryFn : ( ) => Promise < unknown [ ] > ;
18- } [ ] ;
14+ queries : {
15+ sqlStatement : string ;
16+ queryParameters : unknown [ ] ;
17+ tables : string [ ] ;
18+ error ?: Error ;
19+ queryFn : ( ) => Promise < unknown [ ] > ;
20+ } [ ] ;
21+ streamsHaveSynced : boolean ;
22+ } ;
1923
2024export function usePowerSyncQueries (
2125 queries : UsePowerSyncQueriesInput ,
@@ -35,6 +39,14 @@ export function usePowerSyncQueries(
3539 } ) ;
3640 } , [ ] ) ;
3741
42+ // Collect all streams from all query entries into a single flat list for sync tracking.
43+ const allStreams = useMemo ( ( ) => {
44+ const streams = queries . flatMap ( q => q . streams ?? [ ] ) ;
45+ return streams . length > 0 ? streams : undefined ;
46+ } , [ queries ] ) ;
47+
48+ const streamsHaveSynced = useAllSyncStreamsHaveSynced ( powerSync , allStreams ) ;
49+
3850 const updateErrorsArr = useCallback ( ( error : Error | undefined , idx : number ) => {
3951 setErrorsArr ( ( prev ) => {
4052 if ( prev [ idx ] ?. message === error ?. message ) return prev ;
@@ -164,29 +176,33 @@ export function usePowerSyncQueries(
164176 } , [ powerSync , queryClient , tablesArr , updateErrorsArr , stringifiedQueryKeys ] ) ;
165177
166178 return useMemo ( ( ) => {
167- return parsedQueries . map ( ( pq , idx ) => {
168- const error = errorsArr [ idx ] || pq . parseError ;
169-
170- const queryFn = async ( ) => {
171- if ( error ) throw error ;
172- if ( ! pq . query ) throw new Error ( 'No query provided' ) ;
173179
174- try {
175- return typeof pq . query === 'string'
176- ? await powerSync . getAll ( pq . sqlStatement , pq . queryParameters )
177- : await pq . query . execute ( ) ;
178- } catch ( e ) {
179- throw e ;
180- }
181- } ;
182-
183- return {
184- sqlStatement : pq . sqlStatement ,
185- queryParameters : pq . queryParameters ,
186- tables : tablesArr [ idx ] ,
187- error,
188- queryFn
189- } ;
190- } ) ;
180+ return {
181+ queries : parsedQueries . map ( ( pq , idx ) => {
182+ const error = errorsArr [ idx ] || pq . parseError ;
183+
184+ const queryFn = async ( ) => {
185+ if ( error ) throw error ;
186+ if ( ! pq . query ) throw new Error ( 'No query provided' ) ;
187+
188+ try {
189+ return typeof pq . query === 'string'
190+ ? await powerSync . getAll ( pq . sqlStatement , pq . queryParameters )
191+ : await pq . query . execute ( ) ;
192+ } catch ( e ) {
193+ throw e ;
194+ }
195+ } ;
196+
197+ return {
198+ sqlStatement : pq . sqlStatement ,
199+ queryParameters : pq . queryParameters ,
200+ tables : tablesArr [ idx ] ,
201+ error,
202+ queryFn
203+ } ;
204+ } ) ,
205+ streamsHaveSynced
206+ } ;
191207 } , [ parsedQueries , errorsArr , tablesArr , powerSync ] ) ;
192208}
0 commit comments