Skip to content

Instantly share code, notes, and snippets.

@VitorLuizC
Created March 11, 2020 16:54
Show Gist options
  • Save VitorLuizC/2a05cbe92074c621afcb0a4c5953a64f to your computer and use it in GitHub Desktop.
Save VitorLuizC/2a05cbe92074c621afcb0a4c5953a64f to your computer and use it in GitHub Desktop.
import { useCallback, useEffect } from 'react';
const useClickOutside = (
wrapperOrWrappers: null | HTMLElement | (null | HTMLElement)[],
onClickOutside: (event: MouseEvent) => void
) => {
const wrappers = resolveToArray(wrapperOrWrappers);
const handleWindowClick = useCallback(
(event: MouseEvent) => {
const clicked = event.target;
if (!clicked || !(clicked instanceof HTMLElement)) {
return;
}
const haveClickedInside = wrappers.some(
wrapper => !wrapper || wrapper === clicked || wrapper.contains(clicked)
);
if (haveClickedInside) {
return;
}
onClickOutside(event);
},
[onClickOutside, ...wrappers]
);
useEffect(() => {
window.addEventListener('click', handleWindowClick);
return () => {
window.removeEventListener('click', handleWindowClick);
};
}, [handleWindowClick]);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment