@tixae-labs/typesaurus-react
Version:
React Hooks for Typesaurus, type-safe Firestore ODM, MAINTAINED BY TIXAE LABS
52 lines (49 loc) • 1.55 kB
JavaScript
;
exports.useRead = useRead;
var _index = require("../adapter/index.js");
function useRead(query) {
const [result, setResult] = (0, _index.useState)(undefined);
const [error, setError] = (0, _index.useState)(undefined);
(0, _index.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 = (0, _index.useMemo)(() => ({
loading: result === undefined && !error,
error
}), [result, error]);
const tuple = (0, _index.useMemo)(() => [result, status], [result, status]);
return tuple;
}