You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.3 KiB
JavaScript

'use strict';
define('hooks', [], () => {
const Hooks = {
loaded: {},
};
Hooks.register = (hookName, listener) => {
Hooks.loaded[hookName] = Hooks.loaded[hookName] || new Set();
Hooks.loaded[hookName].add(listener);
};
Hooks.on = Hooks.register;
Hooks.hasListeners = hookName => Hooks.loaded[hookName] && Hooks.loaded[hookName].length > 0;
const _fireFilterHook = (hookName, data) => {
const listeners = Array.from(Hooks.loaded[hookName]);
return listeners.reduce((promise, listener) => promise.then(data => listener(data)), Promise.resolve(data));
};
const _fireActionHook = (hookName, data) => {
Hooks.loaded[hookName].forEach(listener => listener(data));
// Backwards compatibility (remove this when we eventually remove jQuery from NodeBB core)
$(window).trigger(hookName, data);
};
const _fireStaticHook = (hookName, data) => {
const listeners = Array.from(Hooks.loaded[hookName]);
return Promise.allSettled(listeners.map(listener => listener(data))).then(() => Promise.resolve(data));
};
Hooks.fire = (hookName, data) => {
const type = hookName.split(':').shift();
switch (type) {
case 'filter':
return _fireFilterHook(hookName, data);
case 'action':
return _fireActionHook(hookName, data);
case 'static':
return _fireStaticHook(hookName, data);
}
};
return Hooks;
});