UNPKG

@ozen-ui/kit

Version:

React component library

94 lines (93 loc) 4.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useBottomSheetBaseDrag = void 0; var tslib_1 = require("tslib"); var react_1 = require("@use-gesture/react"); var math_1 = require("../../../utils/math"); var number_1 = require("../../../utils/number"); var constants_1 = require("../constants"); var context_1 = require("../context"); var useBottomSheetBaseCSSValue_1 = require("./useBottomSheetBaseCSSValue"); var rubberbandIfOutOfBoundsConstant = 0.55; var useBottomSheetBaseDrag = function (target, options) { var _a = options !== null && options !== void 0 ? options : {}, _b = _a.isCloseOnTap, isCloseOnTap = _b === void 0 ? false : _b, _c = _a.isDraggable, isDraggable = _c === void 0 ? true : _c; var _d = (0, context_1.useBottomSheetBaseContext)(), minSnap = _d.minSnap, onCloseContext = _d.onClose, canDrag = _d.canDrag, maxSnap = _d.maxSnap, isClosable = _d.isClosable, snapsControl = _d.snapsControl, findClosestSnap = _d.findClosestSnap, rootRef = _d.rootRef; var userSelect = (0, useBottomSheetBaseCSSValue_1.useBottomSheetBaseCSSValue)({ rootRef: rootRef, defaultValue: 'auto', variableName: constants_1.BOTTOM_SHEET_BASE_CSS_VARIABLE.USER_SELECT, }); var onClose = function () { snapsControl.toClosed(true); onCloseContext === null || onCloseContext === void 0 ? void 0 : onCloseContext(); }; var calculateAnimationTime = function (pxChange, velocity) { var rawTime = Math.abs(pxChange / velocity); if ((0, number_1.isNaN)(rawTime)) { return 0; } return (0, math_1.clamp)(rawTime, 200, 500); }; var onDragStart = function () { userSelect.setValue('none'); }; var onDragFinish = function () { userSelect.setValue('auto'); }; (0, react_1.useDrag)(function (params) { var cancel = params.cancel, down = params.down, first = params.first, last = params.last, _a = params.memo, memo = _a === void 0 ? snapsControl.point.current : _a, _b = tslib_1.__read(params.movement, 2), _my = _b[1], tap = params.tap, _c = tslib_1.__read(params.velocity, 2), velocity = _c[1]; var my = _my * -1; if (!canDrag.current) { cancel(); return memo; } if (isClosable && isCloseOnTap && tap) { cancel(); setTimeout(function () { return onClose(); }, 0); return memo; } if (tap) { return memo; } if (first) { onDragStart(); } var rawOffset = memo + my; var predictedDistance = my * velocity; var predictedPoint = Math.max(minSnap, Math.min(maxSnap, rawOffset + predictedDistance * 2)); if (last && isClosable && rawOffset + predictedDistance < minSnap / 2) { onDragFinish(); onClose(); return memo; } var newOffset = (function () { if (!down) { return predictedPoint; } if (!isClosable && minSnap === maxSnap) { if (rawOffset < minSnap) { return (0, react_1.rubberbandIfOutOfBounds)(rawOffset, minSnap, maxSnap * 1.5, rubberbandIfOutOfBoundsConstant); } return (0, react_1.rubberbandIfOutOfBounds)(rawOffset, minSnap / 1.5, maxSnap, rubberbandIfOutOfBoundsConstant); } return (0, react_1.rubberbandIfOutOfBounds)(rawOffset, isClosable ? 0 : minSnap, maxSnap, rubberbandIfOutOfBoundsConstant); })(); if (last) { var closestSnap = findClosestSnap.current(newOffset); snapsControl.toAnimated(closestSnap, { duration: calculateAnimationTime(Math.abs(closestSnap - snapsControl.point.current), velocity), }); onDragFinish(); return memo; } snapsControl.to(newOffset); return memo; }, { target: isDraggable ? target : { current: null, }, }); }; exports.useBottomSheetBaseDrag = useBottomSheetBaseDrag;