UNPKG

@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
"use strict"; 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 }; }