Skip to content

Instantly share code, notes, and snippets.

@stwgabriel
Last active September 15, 2022 15:20
Show Gist options
  • Select an option

  • Save stwgabriel/58f73d6b09b0681882bd6544943b7248 to your computer and use it in GitHub Desktop.

Select an option

Save stwgabriel/58f73d6b09b0681882bd6544943b7248 to your computer and use it in GitHub Desktop.
click outside to close hook
import { useEffect, useRef } from 'react';
function useClickOutside(handler: () => void, additionalTriggerElement?: Element) {
const domNodeRef = useRef(null);
useEffect(() => {
function outsideHandler(event: Event) {
if (!domNodeRef.current) return;
const refElement = domNodeRef.current as Element;
const eventElement = event.target as Element;
// conditionals
const refElementIsDifferentFromEventElement = refElement !== eventElement;
const refElementIsDifferentFromAdditionalTriggerElement = (
refElement !== additionalTriggerElement);
const refElementDoesntContainsAnEventElement = !refElement.contains(eventElement);
const additionalTriggerElementDoesntContainsAnEventElement = (
!additionalTriggerElement?.contains(eventElement));
if (
refElementIsDifferentFromEventElement
&& refElementIsDifferentFromAdditionalTriggerElement
&& refElementDoesntContainsAnEventElement
&& additionalTriggerElementDoesntContainsAnEventElement
) {
handler();
}
}
document.addEventListener('mousedown', outsideHandler);
return () => {
document.removeEventListener('mousedown', outsideHandler);
};
});
return domNodeRef;
}
export default useClickOutside;

Click outside to close hook

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment