import { useRef, useEffect, useDebugValue } from 'react'; import useMounted from './useMounted'; function useCustomEffect(effect, dependencies, isEqualOrOptions) { var isMounted = useMounted(); var _ref = typeof isEqualOrOptions === 'function' ? { isEqual: isEqualOrOptions } : isEqualOrOptions, isEqual = _ref.isEqual, _ref$effectHook = _ref.effectHook, effectHook = _ref$effectHook === void 0 ? useEffect : _ref$effectHook; var dependenciesRef = useRef(); dependenciesRef.current = dependencies; var cleanupRef = useRef(null); effectHook(function () { // If the ref the is `null` it's either the first effect or the last effect // ran and was cleared, meaning _this_ update should run, b/c the equality // check failed on in the cleanup of the last effect. if (cleanupRef.current === null) { var cleanup = effect(); cleanupRef.current = function () { if (isMounted() && isEqual(dependenciesRef.current, dependencies)) { return; } cleanupRef.current = null; if (cleanup) cleanup(); }; } return cleanupRef.current; }); useDebugValue(effect); } export default useCustomEffect;