UNPKG

react-firehooks

Version:

Lightweight dependency-free collection of React hooks for Firebase

46 lines (45 loc) 1.75 kB
import { useEffect, useMemo, useRef } from "react"; import { useIsMounted } from "./useIsMounted.js"; import { LoadingState, useLoadingValue } from "./useLoadingValue.js"; import { useStableValue } from "./useStableValue.js"; /** * @internal */ export function useGet(reference, getData, isEqual) { const isMounted = useIsMounted(); const { value, setValue, loading, setLoading, error, setError } = useLoadingValue(reference === undefined ? undefined : LoadingState); const stableRef = useStableValue(reference !== null && reference !== void 0 ? reference : undefined, isEqual); const ongoingFetchRef = useRef(); useEffect(() => { if (stableRef === undefined) { setValue(); } else { setLoading(); ongoingFetchRef.current = stableRef; (async () => { try { const data = await getData(stableRef); if (!isMounted.current) { return; } if (!isEqual(ongoingFetchRef.current, stableRef)) { return; } setValue(data); } catch (e) { if (!isMounted.current) { return; } if (!isEqual(ongoingFetchRef.current, stableRef)) { return; } // We assume this is always a Error setError(e); } })(); } }, [stableRef, getData, isEqual, setValue, setLoading, setError, isMounted]); return useMemo(() => [value, loading, error], [value, loading, error]); }