Skip to content

Commit e76e1b7

Browse files
committed
refactor: simplify useLiveQuery subscription lifecycle and add debug logging
Remove requestIdRef tracking mechanism in favor of simpler dependency-based re-execution. Add debug logging for query initialization and refresh operations to improve observability.
1 parent 21363e4 commit e76e1b7

File tree

2 files changed

+15
-21
lines changed

2 files changed

+15
-21
lines changed
Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
1+
import { useCallback, useEffect, useMemo, useState } from "react";
22
import type { DocFragment, DocTypes, DocWithId, IndexKeyType, FPIndexRow, MapFn, Database } from "@fireproof/core-types-base";
33
import 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
}

use-fireproof/tests/use-fireproof-db-switch.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,12 @@ describe("HOOK: useFireproof database switching", () => {
1212
let db1: Database, db2: Database;
1313

1414
beforeAll(async () => {
15-
// Setup two databases with different data
16-
db1 = fireproof(db1Name);
17-
db2 = fireproof(db2Name);
18-
1915
// Add data to db1
16+
db1 = fireproof(db1Name);
2017
await db1.put({ foo: "db1-data" });
2118

2219
// Add different data to db2
20+
db2 = fireproof(db2Name);
2321
await db2.put({ foo: "db2-data" });
2422
});
2523

0 commit comments

Comments
 (0)