UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 1.92 kB
{"version":3,"file":"use-click-outside.mjs","names":[],"sources":["../../src/use-click-outside/use-click-outside.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useRef } from 'react';\n\ntype EventType = MouseEvent | TouchEvent;\n\nconst DEFAULT_EVENTS = ['mousedown', 'touchstart'];\n\nexport function useClickOutside<T extends HTMLElement = any>(\n callback: (event: EventType) => void,\n events?: string[] | null,\n nodes?: (HTMLElement | null)[]\n) {\n const ref = useRef<T>(null);\n const eventsList = events || DEFAULT_EVENTS;\n\n const listener = useEffectEvent((event: Event) => {\n const { target } = event ?? {};\n if (Array.isArray(nodes)) {\n const shouldIgnore =\n !document.body.contains(target as Node) && (target as Element)?.tagName !== 'HTML';\n const shouldTrigger = nodes.every((node) => !!node && !event.composedPath().includes(node));\n shouldTrigger && !shouldIgnore && callback(event as EventType);\n } else if (ref.current && !ref.current.contains(target as Node)) {\n callback(event as EventType);\n }\n });\n\n useEffect(() => {\n eventsList.forEach((fn) => document.addEventListener(fn, listener));\n\n return () => {\n eventsList.forEach((fn) => document.removeEventListener(fn, listener));\n };\n }, []);\n\n return ref;\n}\n"],"mappings":";;;AAIA,MAAM,iBAAiB,CAAC,aAAa,aAAa;AAElD,SAAgB,gBACd,UACA,QACA,OACA;CACA,MAAM,MAAM,OAAU,KAAK;CAC3B,MAAM,aAAa,UAAU;CAE7B,MAAM,WAAW,gBAAgB,UAAiB;EAChD,MAAM,EAAE,WAAW,SAAS,EAAE;AAC9B,MAAI,MAAM,QAAQ,MAAM,EAAE;GACxB,MAAM,eACJ,CAAC,SAAS,KAAK,SAAS,OAAe,IAAK,QAAoB,YAAY;AACxD,SAAM,OAAO,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,SAAS,KAAK,CAAC,IAC1E,CAAC,gBAAgB,SAAS,MAAmB;aACrD,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,OAAe,CAC7D,UAAS,MAAmB;GAE9B;AAEF,iBAAgB;AACd,aAAW,SAAS,OAAO,SAAS,iBAAiB,IAAI,SAAS,CAAC;AAEnE,eAAa;AACX,cAAW,SAAS,OAAO,SAAS,oBAAoB,IAAI,SAAS,CAAC;;IAEvE,EAAE,CAAC;AAEN,QAAO"}