UNPKG

@zohodesk/dot

Version:

In this Library, we Provide Some Basic Components to Build Your Application

159 lines (137 loc) 5.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useDragger; var _react = require("react"); var _DraggerUtil = require("./utils/DraggerUtil"); var _Config = require("../../Provider/Config"); var _defaultProps = _interopRequireDefault(require("./props/defaultProps")); var _propTypes = _interopRequireDefault(require("./props/propTypes")); var _DraggerModule = _interopRequireDefault(require("./css/Dragger.module.css")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } //Hooks from React //CustomFunction //GlobalConfig //Props //CSS function useDragger(_ref) { var isActive = _ref.isActive, ChildRef = _ref.ChildRef, _ref$boundaryLimit = _ref.boundaryLimit, boundaryLimit = _ref$boundaryLimit === void 0 ? (0, _Config.getDotLibraryConfig)('boundaryLimit') : _ref$boundaryLimit; var draggableEle = (0, _react.useRef)(null); var parentEle = (0, _react.useRef)(null); var offset = (0, _react.useRef)({ x: 0, y: 0 }); var draggable = (0, _react.useRef)(false); var dragStarted = (0, _react.useRef)(false); var initialMouse = (0, _react.useRef)({ x: 0, y: 0 }); var DRAG_DISTANCE_THRESHOLD = 4; (0, _react.useEffect)(function () { if (isActive) { parentEle.current = ChildRef.current.closest('[data-drag-parent=true]') || (0, _Config.getDotLibraryConfig)('draggerBoundary') || document.body; } }, [isActive]); //calculateDragPosition --> To sperate Dom action var calculateDragPosition = (0, _react.useCallback)(function (x, y) { if (parentEle.current && draggableEle.current) { return (0, _DraggerUtil.DragPosCalc)({ x: x, y: y, dragWrapper: parentEle.current, element: draggableEle.current, boundaryLimit: boundaryLimit }); } else { return { x: x, y: y }; } }, []); var elementDrag = (0, _react.useCallback)(function (e) { e = e || window.event; e.preventDefault(); if (!draggable.current) { return; } if (!dragStarted.current) { var dx = Math.abs(e.clientX - initialMouse.current.x); var dy = Math.abs(e.clientY - initialMouse.current.y); if (dx < DRAG_DISTANCE_THRESHOLD && dy < DRAG_DISTANCE_THRESHOLD) { return; } var draggableEleRect = draggableEle.current.getBoundingClientRect(); var parentEleRect = parentEle ? parentEle.current.getBoundingClientRect() : { left: 0, top: 0 }; offset.current.x = draggableEleRect.left - e.clientX; offset.current.y = draggableEleRect.top - e.clientY; var relativeRect = { left: draggableEleRect.left - parentEleRect.left, top: draggableEleRect.top - parentEleRect.top }; var styleRef = draggableEle.current.style; styleRef.top = "".concat(relativeRect.top, "px"); styleRef.left = "".concat(relativeRect.left, "px"); styleRef.width = "".concat(draggableEleRect.width, "px"); styleRef.position = "fixed"; styleRef.bottom = "initial"; styleRef.right = "initial"; dragStarted.current = true; } var left = offset.current.x + e.clientX; var top = offset.current.y + e.clientY; var _calculateDragPositio = calculateDragPosition(left, top), x = _calculateDragPositio.x, y = _calculateDragPositio.y; draggableEle.current.style.left = "".concat(x, "px"); draggableEle.current.style.top = "".concat(y, "px"); }, [calculateDragPosition]); var closeDragElement = (0, _react.useCallback)(function () { document.removeEventListener('mouseup', closeDragElement); document.removeEventListener('mousemove', elementDrag); dragStarted.current = false; draggable.current = false; }, []); var dragMouseDown = (0, _react.useCallback)(function (e) { e = e || window.event; // e.preventDefault(); initialMouse.current = { x: e.clientX, y: e.clientY }; dragStarted.current = false; draggable.current = true; document.addEventListener('mouseup', closeDragElement); document.addEventListener('mousemove', elementDrag); }, []); var removeListener = (0, _react.useCallback)(function (draggableEle) { var dragController = draggableEle.current && draggableEle.current.querySelector('[data-drag-hook=true]'); if (dragController) { dragController.removeEventListener('mousedown', dragMouseDown); draggableEle.current = null; } }, []); (0, _react.useEffect)(function () { if (isActive) { draggableEle.current = ChildRef.current.closest('[data-drag-container=true]'); var dragController = draggableEle.current && draggableEle.current.querySelector('[data-drag-hook=true]'); dragController && dragController.addEventListener('mousedown', dragMouseDown); dragController && dragController.classList.add(_DraggerModule["default"].dragCursor); } else { removeListener(draggableEle); } return function () { removeListener(draggableEle); }; }, [ChildRef.current, isActive]); return null; } //Props useDragger.propTypes = _propTypes["default"]; useDragger.defaultProps = _defaultProps["default"];