UNPKG

react-firehooks

Version:

Lightweight dependency-free collection of React hooks for Firebase

34 lines (33 loc) 1.26 kB
import { useEffect, useMemo } from "react"; import { useLoadingValue } from "./useLoadingValue.js"; import { useStableValue } from "./useStableValue.js"; import { usePrevious } from "./usePrevious.js"; /** * @internal */ export function useListen(reference, onChange, isEqual, initialState) { const { error, loading, setLoading, setError, setValue, value } = useLoadingValue(reference === undefined ? undefined : initialState); const stableRef = useStableValue(reference !== null && reference !== void 0 ? reference : undefined, isEqual); const previousRef = usePrevious(stableRef); // set state when ref changes useEffect(() => { if (stableRef === previousRef) { return; } if (stableRef === undefined) { setValue(); } else { setLoading(); } }, [previousRef, setLoading, setValue, stableRef]); // subscribe to changes useEffect(() => { if (stableRef === undefined) { return; } const unsubscribe = onChange(stableRef, setValue, setError); return () => unsubscribe(); }, [onChange, setError, setValue, stableRef]); return useMemo(() => [value, loading, error], [value, loading, error]); }