UNPKG

outsideclick-react

Version:

A React utility hook for detecting outside clicks

2 lines (1 loc) 1.35 kB
import{useEffect as i,useRef as c}from"react";import{jsx as f}from"react/jsx-runtime";var l=({onOutsideClick:e,ignoreElement:o,...t})=>{let n=c(null);return i(()=>{let r=s=>{n.current&&n.current.contains&&!n.current.contains(s.target)&&!u(o,s.target)&&e?.(n.current)};return document.addEventListener("mouseup",r),document.addEventListener("touchend",r),()=>{document.removeEventListener("mouseup",r),document.removeEventListener("touchend",r)}},[]),f("div",{...t,ref:n,children:t.children})};function a(e,o){let t=c(null);return i(()=>{let n=r=>{t.current&&t.current.contains&&!t.current.contains(r.target)&&!u(o,r.target)&&e?.(t.current)};return document.addEventListener("mouseup",n),document.addEventListener("touchend",n),()=>{document.removeEventListener("mouseup",n),document.removeEventListener("touchend",n)}},[]),t}function u(e,o){if(!e)return!1;if(Array.isArray(e)){for(let t of e)if(u(t,o))return!0;return!1}else{if(typeof e=="string")return!!document.querySelector(e)?.contains(o);if(e instanceof HTMLCollection||e instanceof NodeList){for(let t=0;t<e.length;t++){let n=e[t];if(u(n,o))return!0}return!1}else if(e instanceof HTMLElement||e instanceof Element||e instanceof Node){if(e instanceof Node){let t=e.parentElement;return!!t&&t.contains(o)}return e.contains(o)}else return!1}}var d=l;var E=d;export{E as default,a as useOutsideClick};