saleor-dashboard/src/hooks/usePreventHistoryBack.ts
Patryk Andrzejewski 1d2eeb7592
Strict mode plugin (#3778)
* Stric mode plugin

* Update command
2023-06-21 11:28:00 +02:00

54 lines
1.2 KiB
TypeScript

// @ts-strict-ignore
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: HTMLElement,
options?: { defaultEnabled?: boolean },
) => {
const enabled = useRef(options?.defaultEnabled ?? true);
const offsetY = useRef(0);
const wheelHandler = evt => {
if (!enabled.current) {
return;
}
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]);
const enable = () => {
enabled.current = true;
};
const disable = () => {
enabled.current = false;
};
return { enable, disable };
};