diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index c3fa06d349..63e324f07a 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -113,7 +113,9 @@ ajaxify = window.ajaxify || {}; url: url, }; - $(window).trigger('action:ajaxify.start', payload); + require(['hooks'], function (hooks) { + hooks.fire('action:ajaxify.start', payload); + }); ajaxify.count += 1; diff --git a/public/src/modules/hooks.js b/public/src/modules/hooks.js index ef09f7f236..a9c13eb6ef 100644 --- a/public/src/modules/hooks.js +++ b/public/src/modules/hooks.js @@ -3,14 +3,39 @@ define('hooks', [], () => { const Hooks = { loaded: {}, + temporary: new Set(), }; Hooks.register = (hookName, method) => { Hooks.loaded[hookName] = Hooks.loaded[hookName] || new Set(); Hooks.loaded[hookName].add(method); + console.debug(`[hooks] Registered ${hookName}`, method); }; Hooks.on = Hooks.register; + // registerPage/onPage takes care of unregistering the listener on ajaxify + Hooks.registerPage = (hookName, method) => { + Hooks.temporary.add({ hookName, method }); + Hooks.register(hookName, method); + }; + Hooks.onPage = Hooks.registerPage; + Hooks.register('action:ajaxify.start', () => { + Hooks.temporary.forEach((pair) => { + Hooks.unregister(pair.hookName, pair.method); + Hooks.temporary.delete(pair); + }); + }); + + Hooks.unregister = (hookName, method) => { + if (Hooks.loaded[hookName] && Hooks.loaded[hookName].has(method)) { + Hooks.loaded[hookName].delete(method); + console.debug(`[hooks] Unregistered ${hookName}`, method); + } else { + console.debug(`[hooks] Unregistration of ${hookName} failed, passed-in method is not a registered listener or the hook itself has no listeners, currently.`); + } + }; + Hooks.off = Hooks.unregister; + Hooks.hasListeners = hookName => Hooks.loaded[hookName] && Hooks.loaded[hookName].size > 0; const _onHookError = (e, listener, data) => {