{"version":3,"file":"/Users/anthonygubler/development/dojo-org/widgets/src/global-event/index.tsx","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["import global from '@dojo/framework/shim/global';\nimport { create, destroy, diffProperty } from '@dojo/framework/core/vdom';\nimport { shallow } from '@dojo/framework/core/diff';\nimport { createICacheMiddleware } from '@dojo/framework/core/middleware/icache';\n\nexport interface ListenerObject {\n\t[index: string]: (event?: any) => void;\n}\n\nexport interface GlobalEventProperties {\n\t/** The global window object */\n\twindow?: ListenerObject;\n\t/** The document for this context */\n\tdocument?: ListenerObject;\n}\n\nexport interface RegisteredListeners {\n\twindow: ListenerObject;\n\tdocument: ListenerObject;\n}\n\ninterface GlobalEventICache {\n\tlisteners: RegisteredListeners;\n}\n\nconst factory = create({\n\tdestroy,\n\tdiffProperty,\n\ticache: createICacheMiddleware<GlobalEventICache>()\n}).properties<GlobalEventProperties>();\n\nexport const GlobalEvent = factory(function({\n\tchildren,\n\tproperties,\n\tmiddleware: { destroy, diffProperty, icache }\n}) {\n\tconst registerListeners = (\n\t\ttype: 'window' | 'document',\n\t\tpreviousListeners: ListenerObject | undefined,\n\t\tnewListeners: ListenerObject | undefined\n\t) => {\n\t\tconst currentListeners = icache.getOrSet('listeners', {\n\t\t\twindow: {},\n\t\t\tdocument: {}\n\t\t});\n\t\tconst registeredListeners: ListenerObject = {};\n\n\t\tpreviousListeners &&\n\t\t\tObject.keys(previousListeners).forEach((eventName) => {\n\t\t\t\tconst newListener = newListeners ? newListeners[eventName] : undefined;\n\t\t\t\tif (newListener === undefined) {\n\t\t\t\t\tglobal[type].removeEventListener(eventName, currentListeners[type][eventName]);\n\t\t\t\t} else if (previousListeners[eventName] !== newListener) {\n\t\t\t\t\tglobal[type].removeEventListener(eventName, currentListeners[type][eventName]);\n\t\t\t\t\tglobal[type].addEventListener(eventName, newListener);\n\t\t\t\t\tregisteredListeners[eventName] = newListener;\n\t\t\t\t} else {\n\t\t\t\t\tregisteredListeners[eventName] = newListener;\n\t\t\t\t}\n\t\t\t});\n\n\t\tnewListeners &&\n\t\t\tObject.keys(newListeners).forEach((eventName) => {\n\t\t\t\tif (previousListeners === undefined || previousListeners[eventName] === undefined) {\n\t\t\t\t\tglobal[type].addEventListener(eventName, newListeners[eventName]);\n\t\t\t\t\tregisteredListeners[eventName] = newListeners[eventName];\n\t\t\t\t}\n\t\t\t});\n\t\tcurrentListeners[type] = registeredListeners;\n\n\t\ticache.set('listeners', currentListeners);\n\t};\n\n\tdiffProperty('window', properties, (previous, next) => {\n\t\tconst { changed } = shallow(previous.window, next.window);\n\t\tchanged && registerListeners('window', previous.window, next.window);\n\t});\n\tdiffProperty('document', properties, (previous, next) => {\n\t\tconst { changed } = shallow(previous.document, next.document);\n\t\tchanged && registerListeners('document', previous.document, next.document);\n\t});\n\n\tconst removeAllRegisteredListeners = (type: 'window' | 'document') => {\n\t\tconst currentListeners = icache.getOrSet('listeners', {\n\t\t\twindow: {},\n\t\t\tdocument: {}\n\t\t});\n\t\tObject.keys(currentListeners[type]).forEach((eventName) => {\n\t\t\tglobal[type].removeEventListener(eventName, currentListeners[type][eventName]);\n\t\t});\n\t};\n\n\tdestroy(() => {\n\t\tremoveAllRegisteredListeners('window');\n\t\tremoveAllRegisteredListeners('document');\n\t});\n\n\tif (children().length > 0) {\n\t\treturn children();\n\t}\n\treturn null;\n});\n\nexport default GlobalEvent;\n"]}