ra-core
Version:
Core components of react-admin, a frontend Framework for building admin applications on top of REST services, using ES6, React
80 lines • 2.6 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSafeSetState = useSafeSetState;
exports.usePrevious = usePrevious;
exports.useDeepCompareEffect = useDeepCompareEffect;
exports.useTimeout = useTimeout;
exports.useIsMounted = useIsMounted;
const react_1 = require("react");
const isEqual_js_1 = __importDefault(require("lodash/isEqual.js"));
// thanks Kent C Dodds for the following helpers
/**
* @deprecated use `useState` instead, since React no longer
* issues warnings when calling setState on unmounted components.
*/
function useSafeSetState(initialState) {
const [state, setState] = (0, react_1.useState)(initialState);
const mountedRef = (0, react_1.useRef)(false);
(0, react_1.useEffect)(() => {
mountedRef.current = true;
return () => {
mountedRef.current = false;
};
}, []);
const safeSetState = (0, react_1.useCallback)(args => {
if (mountedRef.current) {
return setState(args);
}
}, [mountedRef, setState]);
return [state, safeSetState];
}
function usePrevious(value) {
const ref = (0, react_1.useRef)();
(0, react_1.useEffect)(() => {
ref.current = value;
});
return ref.current;
}
function useDeepCompareEffect(callback, inputs) {
const cleanupRef = (0, react_1.useRef)();
(0, react_1.useEffect)(() => {
if (!(0, isEqual_js_1.default)(previousInputs, inputs)) {
cleanupRef.current = callback();
}
return cleanupRef.current;
});
const previousInputs = usePrevious(inputs);
}
/**
* A hook that returns true once a delay has expired.
* @param ms The delay in milliseconds
* @param key A key that can be used to reset the timer
* @returns true if the delay has expired, false otherwise
*/
function useTimeout(ms = 0, key = '') {
const [ready, setReady] = (0, react_1.useState)(false);
(0, react_1.useEffect)(() => {
setReady(false);
const timer = setTimeout(() => {
setReady(true);
}, ms);
return () => {
clearTimeout(timer);
};
}, [key, ms, setReady]);
return ready;
}
function useIsMounted() {
const isMounted = (0, react_1.useRef)(true);
(0, react_1.useEffect)(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return isMounted;
}
//# sourceMappingURL=hooks.js.map