UNPKG

redux-code

Version:

Redux helpers for actions and reducers

63 lines (62 loc) 2.44 kB
"use strict"; /* eslint-disable @typescript-eslint/ban-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ Object.defineProperty(exports, "__esModule", { value: true }); exports.identity = exports.createActions = exports.createAction = void 0; function processResult(type, result) { // Support redux-thunk if (result instanceof Function) return (dispatch) => { const action = processResult(type, dispatch(result)); return dispatch(action); }; // Support promises with redux-thunk if (result instanceof Promise) return (dispatch) => result.then((value) => { const action = processResult(type, value); return dispatch(action); }); if (result === undefined) return { type }; if (result.type !== undefined) return result; return { type, payload: result }; } /** * Create an action creator * @param type an action type * @param action a source to create an action creator */ function createAction(type, action) { const creator = (...args) => processResult(type, action(...args)); creator.type = type; creator.toString = () => type; return creator; } exports.createAction = createAction; function createActions(prefix, ...mixins) { const source = Object.assign({}, ...mixins.map((mix) => Array.isArray(mix) ? Object.fromEntries(mix.map((val) => [val, exports.identity])) : mix)); const actions = {}; // eslint-disable-next-line prefer-const for (let [name, payload] of Object.entries(source)) { const actionType = `${prefix || ''}${name}`; const action = payload instanceof Function ? payload.bind(actions) : () => payload; actions[name] = createAction(actionType, action); actions[name].type = actionType; } return actions; } exports.createActions = createActions; /** * Just a helper to create identity actions * createActions('prefix/', {update:identity, save:identity}) */ const identity = (arg) => arg; exports.identity = identity; // export function wrapAsync(action: ActionCreator<any>) { // const wrapped = function (dispatch: ThunkDispatch<any, any, any>) {} // wrapped.pending = createAction(`${action.type}:pending`, () => undefined) // wrapped.fulfilled = createAction(`${action.type}:fulfilled`, () => undefined) // wrapped.rejected = createAction(`${action.type}:rejected`, (err) => err) // return wrapped // }