@geist-ui/react
Version:
Modern and minimalist React UI library.
75 lines (64 loc) • 2.97 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import { useEffect, useRef } from 'react';
import useCurrentState from './use-current-state';
var useDrag = function useDrag(elementRef) {
var draggingHandler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
var dragStartHandler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {};
var dragEndHandler = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {};
var onDragging = useRef(false);
var _useCurrentState = useCurrentState(0),
_useCurrentState2 = _slicedToArray(_useCurrentState, 3),
setStartX = _useCurrentState2[1],
startXRef = _useCurrentState2[2];
var _useCurrentState3 = useCurrentState(0),
_useCurrentState4 = _slicedToArray(_useCurrentState3, 3),
setCurrentX = _useCurrentState4[1],
currentXRef = _useCurrentState4[2];
var getCustomEvent = function getCustomEvent() {
return {
startX: startXRef.current,
currentX: currentXRef.current
};
};
var elementMouseDownHandler = function elementMouseDownHandler(event) {
event.stopPropagation();
event.stopImmediatePropagation();
onDragging.current = true;
if (!elementRef || !elementRef.current) return;
setStartX(elementRef.current.getBoundingClientRect().x);
dragStartHandler(getCustomEvent());
};
var globalDraggingHandler = function globalDraggingHandler(event) {
if (!onDragging.current) return;
if (event.type === 'touchmove') {
setCurrentX(event.changedTouches[0].clientX);
} else {
setCurrentX(event.clientX);
}
draggingHandler(getCustomEvent());
};
var globalDragEndHandler = function globalDragEndHandler() {
if (!onDragging.current) return;
onDragging.current = false;
dragEndHandler(getCustomEvent());
};
useEffect(function () {
if (!elementRef || !elementRef.current) return;
elementRef.current.addEventListener('mousedown', elementMouseDownHandler);
elementRef.current.addEventListener('touchstart', elementMouseDownHandler);
window.addEventListener('mousemove', globalDraggingHandler);
window.addEventListener('touchmove', globalDraggingHandler);
window.addEventListener('mouseup', globalDragEndHandler);
window.addEventListener('touchend', globalDragEndHandler);
return function () {
window.removeEventListener('mousemove', globalDraggingHandler);
window.removeEventListener('touchmove', globalDraggingHandler);
window.removeEventListener('mouseup', globalDragEndHandler);
window.removeEventListener('touchend', globalDragEndHandler);
if (!elementRef || !elementRef.current) return;
elementRef.current.removeEventListener('mousedown', elementMouseDownHandler);
elementRef.current.removeEventListener('touchstart', elementMouseDownHandler);
};
}, [elementRef]);
};
export default useDrag;