36 lines
882 B
TypeScript
36 lines
882 B
TypeScript
![]() |
import React, { useRef } from "react";
|
||
|
|
||
|
/**
|
||
|
* Hook that prevents hostory-back when use touchpad on Mac.
|
||
|
* Since overscroll-behavior sometimes may not work (eg. Safari 15 which is in use)
|
||
|
* We need to handle this in JS
|
||
|
*
|
||
|
* https://caniuse.com/css-overscroll-behavior
|
||
|
*/
|
||
|
|
||
|
export const usePreventHistoryBack = (scroller: HTMLDivElement) => {
|
||
|
const offsetY = useRef(0);
|
||
|
|
||
|
const wheelHandler = evt => {
|
||
|
const notVertival = Math.abs(evt.deltaX) - Math.abs(evt.deltaY) >= 0;
|
||
|
|
||
|
if (evt.target.scrollLeft <= 0 && evt.deltaX <= 0 && notVertival) {
|
||
|
evt.preventDefault();
|
||
|
}
|
||
|
|
||
|
offsetY.current = window.scrollY;
|
||
|
};
|
||
|
|
||
|
React.useEffect(() => {
|
||
|
if (!scroller) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
scroller.addEventListener("wheel", wheelHandler, { passive: false });
|
||
|
|
||
|
return () => {
|
||
|
scroller.removeEventListener("wheel", wheelHandler);
|
||
|
};
|
||
|
}, [scroller]);
|
||
|
};
|