@e-group/hooks
Version:
eGroup team react-hooks that share across projects.
49 lines (41 loc) • 1.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useTimeout;
var _react = require("react");
/**
* https://github.com/streamich/react-use/blob/master/src/useTimeoutFn.ts
*/
function useTimeout(cb, ms) {
const ready = (0, _react.useRef)(false);
const timeout = (0, _react.useRef)();
const callback = (0, _react.useRef)(cb);
const isReady = (0, _react.useCallback)(() => ready.current, []);
const set = (0, _react.useCallback)(() => {
ready.current = false;
if (timeout.current) {
clearTimeout(timeout.current);
}
if (ms !== null) {
timeout.current = setTimeout(() => {
ready.current = true;
callback.current();
}, ms);
}
}, [ms]);
const clear = (0, _react.useCallback)(() => {
ready.current = null;
if (timeout.current) {
clearTimeout(timeout.current);
}
}, []); // update ref when function changes
(0, _react.useEffect)(() => {
callback.current = cb;
}, [cb]); // set on mount, clear on unmount
(0, _react.useEffect)(() => {
set();
return clear;
}, [ms]);
return [isReady, clear, set];
}
;