feat: allow hook unregistration, and temporary page-based hooks

Temporary hooks automatically unregister themselves on the next ajaxify, making them perfect for in-page events.
v1.18.x
Julian Lam 4 years ago
parent de6d156533
commit d0136074b6

@ -113,7 +113,9 @@ ajaxify = window.ajaxify || {};
url: url, url: url,
}; };
$(window).trigger('action:ajaxify.start', payload); require(['hooks'], function (hooks) {
hooks.fire('action:ajaxify.start', payload);
});
ajaxify.count += 1; ajaxify.count += 1;

@ -3,14 +3,39 @@
define('hooks', [], () => { define('hooks', [], () => {
const Hooks = { const Hooks = {
loaded: {}, loaded: {},
temporary: new Set(),
}; };
Hooks.register = (hookName, method) => { Hooks.register = (hookName, method) => {
Hooks.loaded[hookName] = Hooks.loaded[hookName] || new Set(); Hooks.loaded[hookName] = Hooks.loaded[hookName] || new Set();
Hooks.loaded[hookName].add(method); Hooks.loaded[hookName].add(method);
console.debug(`[hooks] Registered ${hookName}`, method);
}; };
Hooks.on = Hooks.register; 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; Hooks.hasListeners = hookName => Hooks.loaded[hookName] && Hooks.loaded[hookName].size > 0;
const _onHookError = (e, listener, data) => { const _onHookError = (e, listener, data) => {

Loading…
Cancel
Save