react-firehooks
Version:
Lightweight dependency-free collection of React hooks for Firebase
46 lines (45 loc) • 1.75 kB
JavaScript
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]);
}