fullpage-scroll-component
Version:
Stepped Scroll Component Library.
79 lines (72 loc) • 2.34 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var react = require('react');
var debounce = require('lodash/debounce');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
function useDebouncedScrollDirection({
upScrollCallback,
downScrollCallback,
isPreventDefault,
debounceDelay = 1000
}) {
const [scrollDir, setScrollDir] = react.useState("");
const [touchStart, setTouchStart] = react.useState(0);
react.useEffect(() => {
const debouncedScroll = debounce__default["default"](direction => {
if (direction === "down") {
if (downScrollCallback && isPreventDefault) {
downScrollCallback();
}
}
if (direction === "up") {
if (upScrollCallback && isPreventDefault) {
upScrollCallback();
}
}
}, debounceDelay);
const handleScroll = e => {
if (isPreventDefault) {
e.preventDefault();
}
if (e.deltaY > 0) {
debouncedScroll("down");
setScrollDir("down");
} else if (e.deltaY < 0) {
debouncedScroll("up");
setScrollDir("up");
}
};
const onSetTouchStart = e => {
setTouchStart(e.changedTouches[0].clientY);
};
const handleMobileScroll = e => {
if (isPreventDefault) {
e.preventDefault();
}
if (e.changedTouches[0].clientY < touchStart) {
debouncedScroll("down");
setScrollDir("down");
} else if (e.changedTouches[0].clientY > touchStart) {
debouncedScroll("up");
setScrollDir("up");
}
};
window.addEventListener("wheel", handleScroll, {
passive: false
});
window.addEventListener("touchmove", handleMobileScroll, {
passive: false
});
window.addEventListener("touchstart", onSetTouchStart, {
passive: false
});
return () => {
window.removeEventListener("wheel", handleScroll);
window.removeEventListener("touchmove", handleMobileScroll);
window.removeEventListener("touchstart", onSetTouchStart);
};
}, [upScrollCallback, downScrollCallback, touchStart]);
return scrollDir;
}
exports.useDebouncedScrollDirection = useDebouncedScrollDirection;