@atlaskit/motion
Version:
A set of utilities to apply motion in your application.
83 lines (79 loc) • 2.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useSetTimeout = exports.useRequestAnimationFrame = void 0;
var _react = require("react");
// Handle both browser and Node.js environments
var getHookDeps = function getHookDeps(opts) {
switch (opts.cleanup) {
case 'next-effect':
return undefined;
case 'unmount':
default:
return [];
}
};
/**
* Will return request animation frame as a function which will clean itself up.
*/
var useRequestAnimationFrame = exports.useRequestAnimationFrame = function useRequestAnimationFrame() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
cleanup: 'unmount'
};
var frames = (0, _react.useRef)([]);
(0, _react.useEffect)(function () {
return function () {
if (frames.current.length) {
frames.current.forEach(function (id) {
return cancelAnimationFrame(id);
});
frames.current = [];
}
};
// We dynamically set this so we either clean up on the next effect - or on unmount.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, getHookDeps(opts));
return (0, _react.useCallback)(function (handler) {
var id = requestAnimationFrame(function (time) {
frames.current = frames.current.filter(function (frameId) {
return frameId !== id;
});
handler(time);
});
frames.current.push(id);
}, []);
};
/**
* Will return set timeout as a function which will clean itself up.
*/
var useSetTimeout = exports.useSetTimeout = function useSetTimeout() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
cleanup: 'unmount'
};
var timeouts = (0, _react.useRef)([]);
(0, _react.useEffect)(function () {
return function () {
if (timeouts.current.length) {
timeouts.current.forEach(function (id) {
return clearTimeout(id);
});
timeouts.current = [];
}
};
// We dynamically set this so we either clean up on the next effect - or on unmount.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, getHookDeps(opts));
return (0, _react.useCallback)(function (handler, timeout) {
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
args[_key - 2] = arguments[_key];
}
var id = setTimeout.apply(void 0, [function () {
timeouts.current = timeouts.current.filter(function (timeoutId) {
return timeoutId !== id;
});
handler();
}, timeout].concat(args));
timeouts.current.push(id);
}, []);
};