UNPKG

@uiw/react-drag-event-interactive

Version:
97 lines (95 loc) 4.64 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = {}; exports["default"] = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _utils = require("./utils"); Object.keys(_utils).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _utils[key]) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _utils[key]; } }); }); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["prefixCls", "className", "onMove", "onDown"]; var Interactive = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) { var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'w-color-interactive' : _props$prefixCls, className = props.className, onMove = props.onMove, onDown = props.onDown, reset = (0, _objectWithoutProperties2["default"])(props, _excluded); var container = (0, _react.useRef)(null); var hasTouched = (0, _react.useRef)(false); var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), isDragging = _useState2[0], setDragging = _useState2[1]; var onMoveCallback = (0, _utils.useEventCallback)(onMove); var onKeyCallback = (0, _utils.useEventCallback)(onDown); // Prevent mobile browsers from handling mouse events (conflicting with touch ones). // If we detected a touch interaction before, we prefer reacting to touch events only. var isValid = function isValid(event) { if (hasTouched.current && !(0, _utils.isTouch)(event)) return false; hasTouched.current = (0, _utils.isTouch)(event); return true; }; var handleMove = (0, _react.useCallback)(function (event) { (0, _utils.preventDefaultMove)(event); // If user moves the pointer outside of the window or iframe bounds and release it there, // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor // after the user has moved the mouse/finger back to the document, we check `event.buttons` // and `event.touches`. It allows us to detect that the user is just moving his pointer // without pressing it down var isDown = (0, _utils.isTouch)(event) ? event.touches.length > 0 : event.buttons > 0; if (isDown && container.current) { onMoveCallback && onMoveCallback((0, _utils.getRelativePosition)(container.current, event), event); } else { setDragging(false); } }, [onMoveCallback]); var handleMoveEnd = (0, _react.useCallback)(function () { return setDragging(false); }, []); var toggleDocumentEvents = (0, _react.useCallback)(function (state) { var toggleEvent = state ? window.addEventListener : window.removeEventListener; toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove); toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd); }, []); (0, _react.useEffect)(function () { toggleDocumentEvents(isDragging); return function () { isDragging && toggleDocumentEvents(false); }; }, [isDragging, toggleDocumentEvents]); var handleMoveStart = (0, _react.useCallback)(function (event) { (0, _utils.preventDefaultMove)(event.nativeEvent); if (!isValid(event.nativeEvent)) return; onKeyCallback && onKeyCallback((0, _utils.getRelativePosition)(container.current, event.nativeEvent), event.nativeEvent); setDragging(true); }, [onKeyCallback]); return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), {}, { className: [prefixCls, className || ''].filter(Boolean).join(' '), style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset.style), {}, { touchAction: 'none' }), ref: container, tabIndex: 0, onMouseDown: handleMoveStart, onTouchStart: handleMoveStart })); }); Interactive.displayName = 'Interactive'; var _default = exports["default"] = Interactive;