aboutsummaryrefslogtreecommitdiffstats
path: root/src/actions/lib/actions.js
blob: 7be40f1cfc502ce81837ab1e0ce9bb2d5f5bb5e1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
export const createActionsFromDefinitions = (actionDefinitions, validate) => {
  const actions = {};
  Object.keys(actionDefinitions).forEach((actionName) => {
    const action = (params = {}) => {
      const schema = actionDefinitions[actionName];
      validate(schema, params, actionName);
      action.notify(params);
    };
    actions[actionName] = action;
    action.listeners = [];
    action.listen = (listener) => action.listeners.push(listener);
    action.off = (listener) => {
      const { listeners } = action;
      listeners.splice(listeners.indexOf(listener), 1);
    };
    action.notify = (params) => action.listeners.forEach((listener) => listener(params));
  });
  return actions;
};

export default (definitions, validate) => {
  const newActions = {};
  Object.keys(definitions).forEach((scopeName) => {
    newActions[scopeName] = createActionsFromDefinitions(definitions[scopeName], validate);
  });
  return newActions;
};