import { RefObject, useEffect } from "react"; export function useOnClickOutside( ref: RefObject | RefObject[], handler: (event: MouseEvent | TouchEvent) => void, ) { useEffect(() => { const listener = (event: MouseEvent | TouchEvent) => { const target = event.target as Node; // Do nothing if the target is not connected element with document if (!target || !target.isConnected) { return; } const isOutside = Array.isArray(ref) ? ref.filter((r) => Boolean(r.current)).every((r) => r.current && !r.current.contains(target)) : ref.current && !ref.current.contains(target); if (isOutside) { handler(event); } }; document.addEventListener("mousedown", listener); document.addEventListener("touchstart", listener); return () => { document.removeEventListener("mousedown", listener); document.removeEventListener("touchstart", listener); }; }, [ref, handler]); } export default useOnClickOutside;