react-dom-event
Version:
React context for subscribing to all DOM user interaction events
1 lines • 3.83 kB
Source Map (JSON)
{"version":3,"file":"react-dom-event.cjs","sources":["../../src/index.ts"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { createContext, createElement, useContext, useEffect, useState } from 'react';\n\nexport type EventTypes = MouseEvent | TouchEvent | KeyboardEvent;\nexport type HandlerType = (event: EventTypes) => void;\n\nexport type EventContextType = {\n subscribe: (handler: HandlerType) => void;\n};\n\nexport const EventContext = createContext<EventContextType | undefined>(undefined);\n\nexport type EventProviderProps = {\n events?: string[];\n children?: ReactNode;\n};\nexport function EventProvider({ events = ['click'], children }: EventProviderProps) {\n const state = useState<HandlerType[]>([]);\n const handlers = state[0]; // reduce transpiled array helpers\n\n function onEvent(event: EventTypes) {\n handlers.forEach((handler: HandlerType) => {\n handler(event);\n });\n }\n function subscribe(handler: HandlerType) {\n handlers.push(handler);\n return () => handlers.splice(handlers.indexOf(handler), 1);\n }\n\n useEffect(() => {\n events.forEach((event) => {\n window.document.addEventListener(event, onEvent, true);\n });\n\n return () =>\n events.forEach((event) => {\n window.document.removeEventListener(event, onEvent, true);\n });\n });\n\n return createElement(\n EventContext.Provider,\n {\n value: {\n subscribe,\n },\n },\n children\n );\n}\n\nexport function useEvent(handler: HandlerType, dependencies: unknown[]) {\n const context = useContext(EventContext);\n if (!context) {\n throw new Error('react-dom-event: subscribe not found on context. You might be missing the EventProvider or have multiple instances of react-dom-event');\n }\n\n useEffect(() => context.subscribe(handler), [context.subscribe, handler, ...dependencies, context]);\n}\n"],"names":["EventContext","createContext","undefined","EventProvider","events","children","state","useState","handlers","onEvent","event","forEach","handler","subscribe","push","splice","indexOf","useEffect","window","document","addEventListener","removeEventListener","createElement","Provider","value","useEvent","dependencies","context","useContext","Error"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUO,MAAMA,YAAAA,GAAeC,mBAAAA,CAA4CC,SAAAA;EAMjE,SAASC,cAAc,KAAoD,EAAA;EAApD,IAAA,IAAA,aAAA,GAAA,KAAA,CAAEC,QAAAA,MAAAA,GAAAA,aAAAA,KAAAA,MAAAA,GAAS;EAAC,QAAA;EAAQ,KAAA,GAAA,aAAA,EAAEC,WAAtB,KAAA,CAAsBA,QAAAA;MAClD,IAAMC,KAAAA,GAAQC,eAAwB,EAAE,CAAA;EACxC,IAAA,IAAMC,QAAAA,GAAWF,KAAK,CAAC,CAAA,CAAE;EAEzB,IAAA,SAASG,QAAQC,KAAiB,EAAA;UAChCF,QAAAA,CAASG,OAAO,CAAC,SAACC,OAAAA,EAAAA;cAChBA,OAAAA,CAAQF,KAAAA,CAAAA;EACV,QAAA,CAAA,CAAA;EACF,IAAA;EACA,IAAA,SAASG,UAAUD,OAAoB,EAAA;EACrCJ,QAAAA,QAAAA,CAASM,IAAI,CAACF,OAAAA,CAAAA;UACd,OAAO,WAAA;EAAMJ,YAAAA,OAAAA,QAAAA,CAASO,MAAM,CAACP,QAAAA,CAASQ,OAAO,CAACJ,OAAAA,CAAAA,EAAU,CAAA,CAAA;;EAC1D,IAAA;MAEAK,eAAAA,CAAU,WAAA;UACRb,MAAAA,CAAOO,OAAO,CAAC,SAACD,KAAAA,EAAAA;EACdQ,YAAAA,MAAAA,CAAOC,QAAQ,CAACC,gBAAgB,CAACV,OAAOD,OAAAA,EAAS,IAAA,CAAA;EACnD,QAAA,CAAA,CAAA;UAEA,OAAO,WAAA;qBACLL,MAAAA,CAAOO,OAAO,CAAC,SAACD,KAAAA,EAAAA;EACdQ,gBAAAA,MAAAA,CAAOC,QAAQ,CAACE,mBAAmB,CAACX,OAAOD,OAAAA,EAAS,IAAA,CAAA;EACtD,YAAA,CAAA,CAAA;;EACJ,IAAA,CAAA,CAAA;MAEA,OAAOa,mBAAAA,CACLtB,YAAAA,CAAauB,QAAQ,EACrB;UACEC,KAAAA,EAAO;cACLX,SAAAA,EAAAA;EACF;OACF,EACAR,QAAAA,CAAAA;EAEJ;EAEO,SAASoB,QAAAA,CAASb,OAAoB,EAAEc,YAAuB,EAAA;EACpE,IAAA,IAAMC,UAAUC,gBAAAA,CAAW5B,YAAAA,CAAAA;EAC3B,IAAA,IAAI,CAAC2B,OAAAA,EAAS;EACZ,QAAA,MAAM,IAAIE,KAAAA,CAAM,uIAAA,CAAA;EAClB,IAAA;MAEAZ,eAAAA,CAAU,WAAA;EAAMU,QAAAA,OAAAA,OAAAA,CAAQd,SAAS,CAACD,OAAAA,CAAAA;EAAU,IAAA,CAAA,EAAA;EAACe,QAAAA,OAAAA,CAAQd,SAAS;EAAED,QAAAA;OAAkC,CAAtD,MAAA,CAA6B,qBAAGc,YAAAA,CAAAA,EAAhC;EAA8CC,QAAAA;EAAQ,KAAA,CAAA,CAAA;EACpG;;;;;;;;;;"}