diff --git a/static/js/utils/setup.js b/static/js/utils/setup.js index 5a32a6166..2b34a8161 100644 --- a/static/js/utils/setup.js +++ b/static/js/utils/setup.js @@ -4,6 +4,7 @@ window.utils = window.utils || {}; var registeredSetupListeners = {}; + var activeInstances = {}; /** * setup function to initiate a util (utilName) on a scope (sope) with options (options). @@ -13,20 +14,33 @@ */ window.utils.setup = function(utilName, scope, options) { - - var utilInstance; - if (!utilName || !scope) { return; } options = options || {}; + var utilInstance; + // i18n if (window.I18N) { options.i18n = window.I18N; } + if (activeInstances[utilName]) { + var instanceWithSameScope = activeInstances[utilName] + .filter(function(instance) { return !!instance; }) + .find(function(instance) { + return instance.scope === scope; + }); + var isAlreadySetup = !!instanceWithSameScope; + + if (isAlreadySetup) { + console.warn('Trying to setup a JS utility that\'s already been set up', { utility: utilName, scope, options }); + } + } + + function setup() { var listener = function(event) { if (event.detail.targetUtil !== utilName) { @@ -42,15 +56,25 @@ } utilInstance = util(scope, options); + } + + if (utilInstance) { + if (activeInstances[utilName] && Array.isArray(activeInstances[utilName])) { + activeInstances[utilName].push(utilInstance); + } else { + activeInstances[utilName] = [ utilInstance ]; + } } }; + if (registeredSetupListeners[utilName] && Array.isArray(registeredSetupListeners[utilName])) { window.utils.teardown(utilName); - if (registeredSetupListeners[utilName] && !options.singleton) { + } + + if (!registeredSetupListeners[utilName] || Array.isArray(registeredSetupListeners[utilName])) { + registeredSetupListeners[utilName] = []; + } registeredSetupListeners[utilName].push(listener); - } else { - registeredSetupListeners[utilName] = [ listener ]; - } document.addEventListener('setup', listener); @@ -59,16 +83,32 @@ bubbles: true, cancelable: true, })); + } + + setup(); return utilInstance; }; - window.utils.teardown = function(utilName) { + + window.utils.teardown = function(utilName, destroy) { if (registeredSetupListeners[utilName]) { - registeredSetupListeners[utilName].forEach(function(listener) { + registeredSetupListeners[utilName] + .filter(function(listener) { return !!listener }) + .forEach(function(listener) { document.removeEventListener('setup', listener); }); delete registeredSetupListeners[utilName]; } + + if (destroy === true && activeInstances[utilName]) { + activeInstances[utilName] + .filter(function(instance) { return !!instance }) + .forEach(function(instance) { + console.log({ instance }); + instance.destroy(); + }); + delete activeInstances[utilName]; + } } })();