@tixae-labs/typesaurus-react
Version:
React Hooks for Typesaurus, type-safe Firestore ODM, MAINTAINED BY TIXAE LABS
49 lines (47 loc) • 1.48 kB
JavaScript
import { useEffect, useState, useMemo } from "../adapter/index.mjs";
export function useRead(query) {
const [result, setResult] = useState(undefined);
const [error, setError] = useState(undefined);
useEffect(() => {
// Use ignore flag to prevent setting state after the hook is unmounted
let ignore = false;
// Reset the state since the query has changed
setResult(undefined);
setError(undefined);
// The request is not ready yet
if (!query) return;
if (typeof query === "function") {
// It's a update subscription function, so we call it
const off = query(newResult => {
if (ignore) return;
setResult(newResult);
}).catch(newError => {
if (ignore) return;
setError(newError);
});
return () => {
ignore = true;
off();
};
} else {
// It's a promise, so we await it
query.then(newResult => {
if (ignore) return;
setResult(newResult);
}).catch(newError => {
if (ignore) return;
setError(newError);
});
return () => {
ignore = true;
};
}
// TODO: Come up with a better way to serialize and identify request
}, [query && JSON.stringify(query.request), setResult, setError]);
const status = useMemo(() => ({
loading: result === undefined && !error,
error
}), [result, error]);
const tuple = useMemo(() => [result, status], [result, status]);
return tuple;
}