UNPKG

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
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 }; }