refun
Version:
A collection of React Hook-enabled functions that compose harmoniously with each other. Similar to `recompose`, but:
49 lines (40 loc) • 1.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.mapSafeTimeout = exports.mapSafeTimeoutFactory = void 0;
var _react = require("react");
var _tsfn = require("tsfn");
const mapSafeTimeoutFactory = (setTimeoutFn, clearTimeoutFn) => propName => props => {
const timerIdsRef = (0, _react.useRef)(_tsfn.EMPTY_OBJECT);
const setSafeTimeoutRef = (0, _react.useRef)();
const useEffectFnRef = (0, _react.useRef)();
if (setSafeTimeoutRef.current === _tsfn.UNDEFINED) {
timerIdsRef.current = new Set();
setSafeTimeoutRef.current = (cb, delay) => {
if (timerIdsRef.current === _tsfn.EMPTY_OBJECT) {
return _tsfn.NOOP;
}
const timerId = setTimeoutFn(() => {
timerIdsRef.current.delete(timerId);
cb();
}, delay);
timerIdsRef.current.add(timerId);
return () => {
clearTimeoutFn(timerId);
timerIdsRef.current.delete(timerId);
};
};
useEffectFnRef.current = () => () => {
timerIdsRef.current.forEach(id => clearTimeoutFn(id));
timerIdsRef.current.clear();
timerIdsRef.current = _tsfn.EMPTY_OBJECT;
};
}
(0, _react.useEffect)(useEffectFnRef.current, _tsfn.EMPTY_ARRAY);
return { ...props,
[propName]: setSafeTimeoutRef.current
};
};
exports.mapSafeTimeoutFactory = mapSafeTimeoutFactory;
const mapSafeTimeout = mapSafeTimeoutFactory(setTimeout, clearTimeout);
exports.mapSafeTimeout = mapSafeTimeout;