UNPKG

@yandex/ui

Version:

Yandex UI components

48 lines (47 loc) 1.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useSpring = void 0; var tslib_1 = require("tslib"); var react_1 = require("react"); var rebound_1 = require("rebound"); var useSpring = function (targetValue, tension, friction, immediate) { if (targetValue === void 0) { targetValue = 0; } if (tension === void 0) { tension = 50; } if (friction === void 0) { friction = 3; } if (immediate === void 0) { immediate = false; } var _a = tslib_1.__read(react_1.useState(null), 2), spring = _a[0], setSpring = _a[1]; var _b = tslib_1.__read(react_1.useState(targetValue), 2), value = _b[0], setValue = _b[1]; var listener = react_1.useMemo(function () { return ({ onSpringUpdate: function (currentSpring) { var newValue = currentSpring.getCurrentValue(); setValue(newValue); }, }); }, []); var destroySpring = react_1.useCallback(function () { if (spring) { spring.removeListener(listener); setSpring(null); } }, [spring, listener]); react_1.useEffect(function () { if (immediate) { destroySpring(); } else if (!spring) { var newSpring = new rebound_1.SpringSystem().createSpring(tension, friction); newSpring.setCurrentValue(targetValue); setSpring(newSpring); setValue(targetValue); newSpring.addListener(listener); } return destroySpring; // eslint-disable-next-line react-hooks/exhaustive-deps }, [tension, friction, immediate, spring, listener, destroySpring]); react_1.useEffect(function () { if (spring) { spring.setEndValue(targetValue); } }, [spring, targetValue]); return immediate ? targetValue : value; }; exports.useSpring = useSpring;