UNPKG

@tixae-labs/typesaurus-react

Version:

React Hooks for Typesaurus, type-safe Firestore ODM, MAINTAINED BY TIXAE LABS

49 lines (47 loc) 1.48 kB
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; }