react-selectable-box
Version:
A React component used hooks that allows you to select elements in the drag area using the mouse
104 lines (100 loc) • 3.16 kB
JavaScript
import { useEffect, useRef } from 'react';
import { getClientXY } from "../utils";
var DEFAULT_SCROLL_SPEED = 4;
var EDGE_OFFSET = 1;
export default function useScroll() {
var scrollSpeed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_SCROLL_SPEED;
var topRaf = useRef(null);
var bottomRaf = useRef(null);
var leftRaf = useRef(null);
var rightRaf = useRef(null);
var cancelRaf = function cancelRaf(raf) {
if (raf.current) {
cancelAnimationFrame(raf.current);
raf.current = null;
}
};
var cancelScroll = function cancelScroll() {
cancelRaf(topRaf);
cancelRaf(bottomRaf);
cancelRaf(leftRaf);
cancelRaf(rightRaf);
};
useEffect(function () {
return cancelScroll;
}, []);
var smoothScroll = function smoothScroll(e, _container) {
var container = _container === document.body ? document.documentElement : _container;
var _getClientXY = getClientXY(e),
clientX = _getClientXY.clientX,
clientY = _getClientXY.clientY;
// top
if (clientY - EDGE_OFFSET <= 0 || clientY <= container.getBoundingClientRect().top) {
if (!topRaf.current) {
var callback = function callback() {
if (container.scrollTop > 0) {
topRaf.current = requestAnimationFrame(function () {
container.scrollTop -= scrollSpeed;
callback();
});
}
};
callback();
}
} else {
cancelRaf(topRaf);
}
// bottom
if (clientY + EDGE_OFFSET >= window.innerHeight || clientY >= container.getBoundingClientRect().bottom) {
if (!bottomRaf.current) {
var _callback = function _callback() {
if (container.scrollTop < container.scrollHeight - container.clientHeight) {
bottomRaf.current = requestAnimationFrame(function () {
container.scrollTop += scrollSpeed;
_callback();
});
}
};
_callback();
}
} else {
cancelRaf(bottomRaf);
}
// left
if (clientX - EDGE_OFFSET <= 0 || clientX <= container.getBoundingClientRect().left) {
if (!leftRaf.current) {
var _callback2 = function _callback2() {
if (container.scrollLeft > 0) {
leftRaf.current = requestAnimationFrame(function () {
container.scrollLeft -= scrollSpeed;
_callback2();
});
}
};
_callback2();
}
} else {
cancelRaf(leftRaf);
}
// right
if (clientX + EDGE_OFFSET >= window.innerWidth || clientX >= container.getBoundingClientRect().right) {
if (!rightRaf.current) {
var _callback3 = function _callback3() {
if (container.scrollLeft < container.scrollWidth - container.clientWidth) {
rightRaf.current = requestAnimationFrame(function () {
container.scrollLeft += scrollSpeed;
_callback3();
});
}
};
_callback3();
}
} else {
cancelRaf(rightRaf);
}
};
return {
cancelScroll: cancelScroll,
smoothScroll: smoothScroll
};
}