UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 2.27 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 enabled: boolean = true\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 const shouldIgnore =\n !document.body.contains(target as Node) && (target as Element)?.tagName !== 'HTML';\n\n if (shouldIgnore) {\n return;\n }\n\n const path = event.composedPath();\n\n if (Array.isArray(nodes)) {\n const shouldTrigger = nodes.every((node) => !!node && !path.includes(node));\n shouldTrigger && callback(event as EventType);\n } else if (ref.current && !path.includes(ref.current)) {\n callback(event as EventType);\n }\n });\n\n const eventsKey = eventsList.join(',');\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const events = eventsKey.split(',');\n events.forEach((fn) => document.addEventListener(fn, listener));\n\n return () => {\n events.forEach((fn) => document.removeEventListener(fn, listener));\n };\n }, [eventsKey, enabled]);\n\n return ref;\n}\n"],"mappings":";;;AAIA,MAAM,iBAAiB,CAAC,aAAa,YAAY;AAEjD,SAAgB,gBACd,UACA,QACA,OACA,UAAmB,MACnB;CACA,MAAM,MAAM,OAAU,IAAI;CAC1B,MAAM,aAAa,UAAU;CAE7B,MAAM,WAAW,gBAAgB,UAAiB;EAChD,MAAM,EAAE,WAAW,SAAS,CAAC;EAI7B,IAFE,CAAC,SAAS,KAAK,SAAS,MAAc,KAAM,QAAoB,YAAY,QAG5E;EAGF,MAAM,OAAO,MAAM,aAAa;EAEhC,IAAI,MAAM,QAAQ,KAAK,GAErB,MAD4B,OAAO,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,SAAS,IAAI,CAC7D,KAAK,SAAS,KAAkB;OACvC,IAAI,IAAI,WAAW,CAAC,KAAK,SAAS,IAAI,OAAO,GAClD,SAAS,KAAkB;CAE/B,CAAC;CAED,MAAM,YAAY,WAAW,KAAK,GAAG;CAErC,gBAAgB;EACd,IAAI,CAAC,SACH;EAGF,MAAM,SAAS,UAAU,MAAM,GAAG;EAClC,OAAO,SAAS,OAAO,SAAS,iBAAiB,IAAI,QAAQ,CAAC;EAE9D,aAAa;GACX,OAAO,SAAS,OAAO,SAAS,oBAAoB,IAAI,QAAQ,CAAC;EACnE;CACF,GAAG,CAAC,WAAW,OAAO,CAAC;CAEvB,OAAO;AACT"}