efcsydney/efcsydney-roster

View on GitHub
client/src/resource/actions.js

Summary

Maintainability
A
0 mins
Test Coverage
import _ from 'lodash';

const upper = string => _.snakeCase(string).toUpperCase();

const createAsyncAction = (name, method, stage = '') => {
  const TYPE = upper([method, name, stage].join('_'));
  const actionCreator = (params, meta) => {
    const action = {
      type: TYPE,
      payload: params,
      meta: meta,
      resource: {
        name,
        method,
        stage: stage || 'start'
      }
    };
    if (params instanceof Error) {
      action.error = true;
    }
    return action;
  };
  actionCreator.toString = function() {
    return TYPE;
  };
  return actionCreator;
};

const createApiActions = endpoint => {
  return {
    [_.camelCase(`create_${endpoint}`)]: createAsyncAction(endpoint, 'create'),
    [_.camelCase(`create_${endpoint}_complete`)]: createAsyncAction(
      endpoint,
      'create',
      'complete'
    ),
    [_.camelCase(`create_${endpoint}_reset`)]: createAsyncAction(
      endpoint,
      'create',
      'reset'
    ),
    [_.camelCase(`retrieve_${endpoint}`)]: createAsyncAction(
      endpoint,
      'retrieve'
    ),
    [_.camelCase(`retrieve_${endpoint}_complete`)]: createAsyncAction(
      endpoint,
      'retrieve',
      'complete'
    ),
    [_.camelCase(`retrieve_${endpoint}_reset`)]: createAsyncAction(
      endpoint,
      'retrieve',
      'reset'
    ),
    [_.camelCase(`modify_${endpoint}`)]: createAsyncAction(endpoint, 'modify'),
    [_.camelCase(`modify_${endpoint}_complete`)]: createAsyncAction(
      endpoint,
      'modify',
      'complete'
    ),
    [_.camelCase(`modify_${endpoint}_reset`)]: createAsyncAction(
      endpoint,
      'modify',
      'reset'
    ),
    [_.camelCase(`delete_${endpoint}`)]: createAsyncAction(endpoint, 'delete'),
    [_.camelCase(`delete_${endpoint}_complete`)]: createAsyncAction(
      endpoint,
      'delete',
      'complete'
    ),
    [_.camelCase(`delete_${endpoint}_reset`)]: createAsyncAction(
      endpoint,
      'delete',
      'reset'
    )
  };
};

export { createAsyncAction, createApiActions };