sqlocal
Version:
SQLocal makes it easy to run SQLite3 in the browser, backed by the origin private file system.
38 lines • 1.29 kB
JavaScript
import { useCallback, useMemo, useState, useSyncExternalStore, } from 'react';
/**
* A hook for using reactive SQL queries in React components.
* @see {@link https://sqlocal.dev/api/reactivequery#react}
*/
export function useReactiveQuery(db, query) {
const [error, setError] = useState(undefined);
const [pending, setPending] = useState(true);
const [dbValue, setDb] = useState(() => db);
const [queryValue, setQuery] = useState(() => query);
const reactiveQuery = useMemo(() => {
setPending(true);
return dbValue.reactiveQuery(queryValue);
}, [dbValue, queryValue]);
const get = useCallback(() => reactiveQuery.value, [reactiveQuery]);
const subscribe = useCallback((cb) => {
const subscription = reactiveQuery.subscribe(() => {
cb();
setError(undefined);
setPending(false);
}, (err) => {
setError(err);
});
return () => {
subscription.unsubscribe();
};
}, [reactiveQuery]);
const data = useSyncExternalStore(subscribe, get);
const status = !!error ? 'error' : pending ? 'pending' : 'ok';
return {
data,
error,
status,
setDb,
setQuery,
};
}
//# sourceMappingURL=index.js.map