@react-hook/event
Version:
A React hook for managing event listeners, e.g. removing events when a component unmounts.
1 lines • 2.84 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/index.tsx"],"sourcesContent":["import * as React from 'react'\n\nfunction useEvent<\n T extends Window = Window,\n K extends keyof WindowEventMap = keyof WindowEventMap\n>(\n target: Window | null,\n type: K,\n listener: WindowEventListener<K>,\n cleanup?: (...args: any[]) => void\n): void\nfunction useEvent<\n T extends Document = Document,\n K extends keyof DocumentEventMap = keyof DocumentEventMap\n>(\n target: Document | null,\n type: K,\n listener: DocumentEventListener<K>,\n cleanup?: (...args: any[]) => void\n): void\nfunction useEvent<\n T extends HTMLElement = HTMLElement,\n K extends keyof HTMLElementEventMap = keyof HTMLElementEventMap\n>(\n target: React.RefObject<T> | T | null,\n type: K,\n listener: ElementEventListener<K>,\n cleanup?: (...args: any[]) => void\n): void\nfunction useEvent(target: any, type: any, listener: any, cleanup: any): void {\n const storedListener = React.useRef(listener)\n const storedCleanup = React.useRef(cleanup)\n\n React.useEffect(() => {\n storedListener.current = listener\n storedCleanup.current = cleanup\n })\n\n React.useEffect(() => {\n const targetEl = target && 'current' in target ? target.current : target\n if (!targetEl) return\n\n let didUnsubscribe = 0\n function listener(this: any, ...args: any[]) {\n if (didUnsubscribe) return\n storedListener.current.apply(this, args)\n }\n\n targetEl.addEventListener(type, listener)\n const cleanup = storedCleanup.current\n\n return () => {\n didUnsubscribe = 1\n targetEl.removeEventListener(type, listener)\n cleanup && cleanup()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [target, type])\n}\n\nexport type ElementEventListener<\n K extends keyof HTMLElementEventMap = keyof HTMLElementEventMap\n> = (this: HTMLElement, ev: HTMLElementEventMap[K]) => any\n\nexport type DocumentEventListener<\n K extends keyof DocumentEventMap = keyof DocumentEventMap\n> = (this: Document, ev: DocumentEventMap[K]) => any\n\nexport type WindowEventListener<\n K extends keyof WindowEventMap = keyof WindowEventMap\n> = (this: Document, ev: WindowEventMap[K]) => any\n\nexport default useEvent\n"],"names":["target","type","listener","cleanup","storedListener","React","storedCleanup","current","didUnsubscribe","args","apply","this","targetEl","addEventListener","removeEventListener"],"mappings":"6DA6BA,SAAkBA,EAAaC,EAAWC,EAAeC,OACjDC,EAAiBC,EAAaH,GAC9BI,EAAgBD,EAAaF,GAEnCE,EAAgB,KACdD,EAAeG,QAAUL,EACzBI,EAAcC,QAAUJ,IAG1BE,EAAgB,cAKLH,QACHM,8BAD0BC,2BAAAA,kBAE9BL,EAAeG,QAAQG,MAAMC,KAAMF,QAN/BG,EAAWZ,GAAU,YAAaA,EAASA,EAAOO,QAAUP,KAC7DY,OAEDJ,EAAiB,EAMrBI,EAASC,iBAAiBZ,EAAMC,OAC1BC,EAAUG,EAAcC,cAEvB,KACLC,EAAiB,EACjBI,EAASE,oBAAoBb,EAAMC,GACnCC,GAAWA,OAGZ,CAACH,EAAQC"}