1- import { useCallback , useEffect , useMemo , useRef , useState } from "react" ;
1+ import { useCallback , useEffect , useMemo , useState } from "react" ;
22import type { DocFragment , DocTypes , DocWithId , IndexKeyType , FPIndexRow , MapFn , Database } from "@fireproof/core-types-base" ;
33import type { LiveQueryResult } from "./types.js" ;
44
@@ -12,42 +12,38 @@ export function createUseLiveQuery(database: Database) {
1212 initialRows : FPIndexRow < K , T , R > [ ] = [ ] ,
1313 ) : LiveQueryResult < T , K , R > {
1414 const [ hydrated , setHydrated ] = useState ( false ) ;
15- const [ result , setResult ] = useState < Omit < LiveQueryResult < T , K , R > , "hydrated" > > ( {
15+
16+ const [ result , setResult ] = useState < Omit < LiveQueryResult < T , K , R > , "hydrated" > > ( ( ) => ( {
1617 docs : initialRows . map ( ( r ) => r . doc ) . filter ( ( r ) : r is DocWithId < T > => ! ! r ) ,
1718 rows : initialRows ,
18- } ) ;
19+ } ) ) ;
1920
2021 const queryString = useMemo ( ( ) => JSON . stringify ( query ) , [ query ] ) ;
2122 const mapFnString = useMemo ( ( ) => mapFn . toString ( ) , [ mapFn ] ) ;
2223
23- // Track request ID to prevent stale results from overwriting newer queries
24- const requestIdRef = useRef ( 0 ) ;
25-
26- // Reset hydrated when query dependencies change
2724 useEffect ( ( ) => {
2825 setHydrated ( false ) ;
29- requestIdRef . current += 1 ;
3026 } , [ mapFnString , queryString ] ) ;
3127
3228 const refreshRows = useCallback ( async ( ) => {
33- const myReq = ++ requestIdRef . current ;
3429 const res = await database . query < T , K , R > ( mapFn , { ...query , includeDocs : true } ) ;
35-
36- // Only update state if this is still the latest request
37- if ( myReq === requestIdRef . current ) {
38- setResult ( res ) ;
39- setHydrated ( true ) ;
40- }
41- } , [ database , mapFn , query , mapFnString , queryString ] ) ;
30+ database . logger . Debug ( ) . Str ( "dbname" , database . name ) . Uint64 ( "rows" , res . rows . length ) . Msg ( "Refreshing live query" ) ;
31+ setResult ( res ) ;
32+ setHydrated ( true ) ;
33+ } , [ database , mapFnString , queryString ] ) ;
4234
4335 useEffect ( ( ) => {
44- refreshRows ( ) ;
36+ database . logger . Debug ( ) . Str ( "dbname" , database . name ) . Msg ( "Initializing live query subscription" ) ;
4537 const unsubscribe = database . subscribe ( refreshRows ) ;
4638 return ( ) => {
4739 unsubscribe ( ) ;
4840 } ;
4941 } , [ database , refreshRows ] ) ;
5042
43+ useEffect ( ( ) => {
44+ refreshRows ( ) ;
45+ } , [ database , queryString , mapFnString ] ) ;
46+
5147 return { ...result , hydrated } ;
5248 } ;
5349}
0 commit comments