mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
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.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user