import { RefObject, useEffect, useRef } from 'react' export function useOnClickOutside( node: RefObject, handler: undefined | (() => void) ) { const handlerRef = useRef void)>(handler) useEffect(() => { handlerRef.current = handler }, [handler]) useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (node.current?.contains(e.target as Node) ?? false) { return } if (handlerRef.current) handlerRef.current() } document.addEventListener('mousedown', handleClickOutside) return () => { document.removeEventListener('mousedown', handleClickOutside) } }, [node]) }