From 96f13e4f5d127a4362d1e86f6f7839fd3865a363 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 9 Nov 2021 19:29:29 -0500 Subject: [PATCH] feat: #9992, hooks.one --- public/src/modules/hooks.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/public/src/modules/hooks.js b/public/src/modules/hooks.js index c474d9b15f..f324bc706e 100644 --- a/public/src/modules/hooks.js +++ b/public/src/modules/hooks.js @@ -4,6 +4,7 @@ define('hooks', [], () => { const Hooks = { loaded: {}, temporary: new Set(), + runOnce: new Set(), deprecated: { 'action:script.load': 'filter:script.load', // 👋 @ 1.18.0 'action:category.loaded': 'action:topics.loaded', // 👋 @ 1.19.0 @@ -32,6 +33,10 @@ define('hooks', [], () => { console.debug(`[hooks] Registered ${hookName}`, method); }; Hooks.on = Hooks.register; + Hooks.one = (hookName, method) => { + Hooks.register(hookName, method); + Hooks.runOnce.add({ hookName, method }); + }; // registerPage/onPage takes care of unregistering the listener on ajaxify Hooks.registerPage = (hookName, method) => { @@ -110,17 +115,27 @@ define('hooks', [], () => { Hooks.fire = (hookName, data) => { const type = hookName.split(':').shift(); - + let result; switch (type) { case 'filter': - return _fireFilterHook(hookName, data); + result = _fireFilterHook(hookName, data); + break; case 'action': - return _fireActionHook(hookName, data); + result = _fireActionHook(hookName, data); + break; case 'static': - return _fireStaticHook(hookName, data); + result = _fireStaticHook(hookName, data); + break; } + Hooks.runOnce.forEach((pair) => { + if (pair.hookName === hookName) { + Hooks.unregister(hookName, pair.method); + Hooks.runOnce.delete(pair); + } + }); + return result; }; return Hooks;