aboutsummaryrefslogtreecommitdiffstats
path: root/src/actions/lib/actions.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/actions/lib/actions.ts')
-rw-r--r--src/actions/lib/actions.ts34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/actions/lib/actions.ts b/src/actions/lib/actions.ts
new file mode 100644
index 000000000..412a0d895
--- /dev/null
+++ b/src/actions/lib/actions.ts
@@ -0,0 +1,34 @@
1export const createActionsFromDefinitions = (actionDefinitions, validate) => {
2 const actions = {};
3 // eslint-disable-next-line unicorn/no-array-for-each
4 Object.keys(actionDefinitions).forEach(actionName => {
5 const action = (params = {}) => {
6 const schema = actionDefinitions[actionName];
7 validate(schema, params, actionName);
8 action.notify(params);
9 };
10 actions[actionName] = action;
11 action.listeners = [];
12 action.listen = listener => action.listeners.push(listener);
13 action.off = listener => {
14 const { listeners } = action;
15 listeners.splice(listeners.indexOf(listener), 1);
16 };
17 action.notify = params =>
18 // eslint-disable-next-line unicorn/no-array-for-each
19 action.listeners.forEach(listener => listener(params));
20 });
21 return actions;
22};
23
24export default (definitions, validate) => {
25 const newActions = {};
26 // eslint-disable-next-line unicorn/no-array-for-each
27 Object.keys(definitions).forEach(scopeName => {
28 newActions[scopeName] = createActionsFromDefinitions(
29 definitions[scopeName],
30 validate,
31 );
32 });
33 return newActions;
34};