UNPKG

1.66 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = useAnimationFrame;
5
6var _react = require("react");
7
8var _useMounted = _interopRequireDefault(require("./useMounted"));
9
10var _useStableMemo = _interopRequireDefault(require("./useStableMemo"));
11
12var _useWillUnmount = _interopRequireDefault(require("./useWillUnmount"));
13
14function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16/**
17 * Returns a controller object for requesting and cancelling an animation freame that is properly cleaned up
18 * once the component unmounts. New requests cancel and replace existing ones.
19 *
20 * ```ts
21 * const [style, setStyle] = useState({});
22 * const animationFrame = useAnimationFrame();
23 *
24 * const handleMouseMove = (e) => {
25 * animationFrame.request(() => {
26 * setStyle({ top: e.clientY, left: e.clientY })
27 * })
28 * }
29 *
30 * const handleMouseUp = () => {
31 * animationFrame.cancel()
32 * }
33 *
34 * return (
35 * <div onMouseUp={handleMouseUp} onMouseMove={handleMouseMove}>
36 * <Ball style={style} />
37 * </div>
38 * )
39 * ```
40 */
41function useAnimationFrame() {
42 var isMounted = (0, _useMounted.default)();
43 var handle = (0, _react.useRef)();
44
45 var cancel = function cancel() {
46 if (handle.current != null) {
47 cancelAnimationFrame(handle.current);
48 }
49 };
50
51 (0, _useWillUnmount.default)(cancel);
52 return (0, _useStableMemo.default)(function () {
53 return {
54 request: function request(cancelPrevious, fn) {
55 if (!isMounted()) return;
56 if (cancelPrevious) cancel();
57 handle.current = requestAnimationFrame(fn || cancelPrevious);
58 },
59 cancel: cancel
60 };
61 }, []);
62}
\No newline at end of file