For my own purposes, I slightly modified the hook, adding my own base events. And also added an attribute that excludes certain types of events, if necessary:
export type HandledEvent =
| typeof MOUSEDOWN
| typeof WHEEL
| typeof POINTERDOWN
| typeof TOUCHSTART
| typeof KEYDOWN;
export default function useOnEventOutside(
ref: React.RefObject<HTMLElement>,
handler: Handler | null,
excludedEvents: HandledEvent[] = [],
{ document = currentDocument } = {},
): void {
const handlerRef = useLatest(handler);
useEffect(() => {
...
const eventList = events.filter((item) => !excludedEvents.includes(item));
eventList.forEach((event) => {
document.addEventListener(event, listener, getAddOptions(event));
});
return () => {
eventList.forEach((event) => {
document.removeEventListener(event, listener);
});
};
}, [handler, document, ref, handlerRef, excludedEvents]);
}