@yandex/ui
Version:
Yandex UI components
48 lines (47 loc) • 1.87 kB
JavaScript
;
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;