import { MutableRefObject, useEffect } from "react"; export function useOnClickOutside( ref: MutableRefObject, handler: (event: MouseEvent | TouchEvent) => void, ) { useEffect(() => { const listener = (event: MouseEvent | TouchEvent) => { const target = event.target as Node; if (!ref.current || ref.current.contains(target)) { return; } handler(event); }; document.addEventListener("mousedown", listener as EventListener); document.addEventListener("touchstart", listener as EventListener); return () => { document.removeEventListener("mousedown", listener as EventListener); document.removeEventListener("touchstart", listener as EventListener); }; }, [ref, handler]); }