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,
|
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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user