UNPKG

@gechiui/compose

Version:
85 lines (75 loc) 2.32 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useDragging; var _element = require("@gechiui/element"); var _useIsomorphicLayoutEffect = _interopRequireDefault(require("../use-isomorphic-layout-effect")); /** * GeChiUI dependencies */ /** * Internal dependencies */ /** * @param {Object} props * @param {(e: MouseEvent) => void} props.onDragStart * @param {(e: MouseEvent) => void} props.onDragMove * @param {(e: MouseEvent) => void} props.onDragEnd */ function useDragging(_ref) { let { onDragStart, onDragMove, onDragEnd } = _ref; const [isDragging, setIsDragging] = (0, _element.useState)(false); const eventsRef = (0, _element.useRef)({ onDragStart, onDragMove, onDragEnd }); (0, _useIsomorphicLayoutEffect.default)(() => { eventsRef.current.onDragStart = onDragStart; eventsRef.current.onDragMove = onDragMove; eventsRef.current.onDragEnd = onDragEnd; }, [onDragStart, onDragMove, onDragEnd]); const onMouseMove = (0, _element.useCallback)(( /** @type {MouseEvent} */ event) => eventsRef.current.onDragMove && eventsRef.current.onDragMove(event), []); const endDrag = (0, _element.useCallback)(( /** @type {MouseEvent} */ event) => { if (eventsRef.current.onDragEnd) { eventsRef.current.onDragEnd(event); } document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', endDrag); setIsDragging(false); }, []); const startDrag = (0, _element.useCallback)(( /** @type {MouseEvent} */ event) => { if (eventsRef.current.onDragStart) { eventsRef.current.onDragStart(event); } document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', endDrag); setIsDragging(true); }, []); // Remove the global events when unmounting if needed. (0, _element.useEffect)(() => { return () => { if (isDragging) { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', endDrag); } }; }, [isDragging]); return { startDrag, endDrag, isDragging }; } //# sourceMappingURL=index.js.map