import { RefObject, useEffect } from 'react' type Handler = (event: MouseEvent) => void type Props = { ref: RefObject handler: Handler capture?: boolean isEnabled?: boolean } export const useOutsideClick = ({ ref, handler, capture, isEnabled, }: Props): void => { useEffect(() => { if (isEnabled === false) return const triggerHandlerIfOutside = (event: MouseEvent) => { const el = ref?.current if (!el || el.contains(event.target as Node)) { return } handler(event) } document.addEventListener('pointerdown', triggerHandlerIfOutside, { capture, }) return () => { document.removeEventListener('pointerdown', triggerHandlerIfOutside, { capture, }) } }, [capture, handler, isEnabled, ref]) }