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.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/actions/lib/actions.ts b/src/actions/lib/actions.ts
new file mode 100644
index 000000000..ed42eabc0
--- /dev/null
+++ b/src/actions/lib/actions.ts
@@ -0,0 +1,31 @@
1export const createActionsFromDefinitions = (actionDefinitions, validate) => {
2 const actions = {};
3 Object.keys(actionDefinitions).forEach(actionName => {
4 const action = (params = {}) => {
5 const schema = actionDefinitions[actionName];
6 validate(schema, params, actionName);
7 action.notify(params);
8 };
9 actions[actionName] = action;
10 action.listeners = [];
11 action.listen = listener => action.listeners.push(listener);
12 action.off = listener => {
13 const { listeners } = action;
14 listeners.splice(listeners.indexOf(listener), 1);
15 };
16 action.notify = params =>
17 action.listeners.forEach(listener => listener(params));
18 });
19 return actions;
20};
21
22export default (definitions, validate) => {
23 const newActions = {};
24 Object.keys(definitions).forEach(scopeName => {
25 newActions[scopeName] = createActionsFromDefinitions(
26 definitions[scopeName],
27 validate,
28 );
29 });
30 return newActions;
31};