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