@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
74 lines (65 loc) • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useSwipeToDismiss;
var _react = require("react");
var _consts = require("../consts");
function useSwipeToDismiss(ref, onDismiss, distanceBeforeDismiss, direction) {
const node = ref.current;
const [removing, setRemoving] = (0, _react.useState)(false);
const [pressedPosition, setPressedPosition] = (0, _react.useState)(false);
const [positionLeft, setPositionLeft] = (0, _react.useState)(0);
const [opacity, setOpacity] = (0, _react.useState)(1);
const remove = (0, _react.useCallback)(() => {
setTimeout(() => {
onDismiss();
}, _consts.SWIPE_DISMISS_DELAY);
}, [onDismiss]);
const onMouseUp = (0, _react.useCallback)(() => {
if (!removing) {
setPressedPosition(false);
setPositionLeft(0);
setOpacity(1);
}
}, [removing]);
const onMouseMove = (0, _react.useCallback)(ev => {
if (removing) return;
if (pressedPosition && node) {
let newPositionLeft = ev.screenX - pressedPosition;
const directionValue = direction === "right" ? 1 : -1;
if (direction === "right" && newPositionLeft >= node.offsetWidth * distanceBeforeDismiss / 100 || direction === "left" && newPositionLeft * directionValue >= node.offsetWidth * distanceBeforeDismiss / 100) {
newPositionLeft += node.offsetWidth * directionValue;
setRemoving(true);
remove();
} else if (direction === "right") {
newPositionLeft = newPositionLeft < 0 ? 0 : newPositionLeft;
} else {
newPositionLeft = newPositionLeft > 0 ? 0 : newPositionLeft;
}
setPositionLeft(newPositionLeft);
setOpacity((100 - newPositionLeft * directionValue * 100 / (node.offsetWidth * 2)) / 100);
}
}, [removing, pressedPosition, direction, distanceBeforeDismiss, node, remove]);
const onMouseDown = (0, _react.useCallback)(ev => setPressedPosition(ev.screenX), [setPressedPosition]);
(0, _react.useEffect)(() => {
if (!node) setOpacity(1.1);else node.addEventListener("mousedown", onMouseDown);
return () => {
if (node) node.removeEventListener("mousedown", onMouseDown);
};
}, [node, onMouseDown, setOpacity]);
(0, _react.useEffect)(() => {
var _document$body, _document$body2;
(_document$body = document.body) === null || _document$body === void 0 ? void 0 : _document$body.addEventListener("mouseup", onMouseUp);
(_document$body2 = document.body) === null || _document$body2 === void 0 ? void 0 : _document$body2.addEventListener("mousemove", onMouseMove);
return () => {
var _document$body3, _document$body4;
(_document$body3 = document.body) === null || _document$body3 === void 0 ? void 0 : _document$body3.removeEventListener("mouseup", onMouseUp);
(_document$body4 = document.body) === null || _document$body4 === void 0 ? void 0 : _document$body4.removeEventListener("mousemove", onMouseMove);
};
}, [onMouseUp, onMouseDown, onMouseMove]);
return {
swipeOffset: positionLeft,
swipeOpacity: opacity
};
}