@ifed/hook
Version:
54 lines (53 loc) • 1.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useDraggableScroll;
function useDraggableScroll(ref, options = {
direction: 'both'
}) {
if (process.env.NODE_ENV === 'development') {
if (typeof ref !== 'object' || typeof ref.current === 'undefined') {
console.error('`useDraggableScroll` expects a single ref argument.');
}
}
const {
direction
} = options;
let initialPosition = {
scrollTop: 0,
scrollLeft: 0,
mouseX: 0,
mouseY: 0
};
const mouseMoveHandler = event => {
if (ref.current) {
const dx = event.clientX - initialPosition.mouseX;
const dy = event.clientY - initialPosition.mouseY;
if (direction !== 'horizontal') ref.current.scrollTop = initialPosition.scrollTop - dy;
if (direction !== 'vertical') ref.current.scrollLeft = initialPosition.scrollLeft - dx;
}
};
const mouseUpHandler = () => {
if (ref.current) ref.current.style.cursor = 'grab';
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
};
const onMouseDown = event => {
if (ref.current) {
initialPosition = {
scrollLeft: ref.current.scrollLeft,
scrollTop: ref.current.scrollTop,
mouseX: event.clientX,
mouseY: event.clientY
};
ref.current.style.cursor = 'grabbing';
ref.current.style.userSelect = 'none';
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
};
return {
onMouseDown
};
}