import { createAction } from 'redux-actions'; import camelCase from 'lodash-es/camelCase'; import toUpper from 'lodash-es/toUpper'; function createRequestTypes(base) { const res = {}; ['REQUEST', 'SUCCESS', 'FAILURE'].forEach((type) => { res[type] = `${base}_${type}`; }); return res; } // base is something like my_career; // camelCase: myCareer // capitalize: MY_CAREER export function createFetchTypesAndFuncs(base) { const camelCaseBase = camelCase(base); const toUpperBase = toUpper(base); const TYPES = createRequestTypes(toUpperBase); return { [toUpperBase]: TYPES, [camelCaseBase]: { // request(data) request: createAction(TYPES.REQUEST), // params here is request parameters success: createAction(TYPES.SUCCESS, ({ response }) => response, ({ params }) => params), failure: createAction(TYPES.FAILURE, ({ error }) => error, ({ params }) => params), }, }; } // input: LOAD_SOMETHING // output: LOAD_SOMETHING, loadSomething export function createConstAndAction(base) { const camelCaseBase = camelCase(base); return { [base]: base, [camelCaseBase]: createAction(base), }; }