UNPKG

genji-core

Version:

The core lightweight library for genji, based on redux and redux-saga.

52 lines (48 loc) 1.23 kB
import invariant from 'invariant'; import prefixedDispatch from './prefixedDispatch'; import { isFunction } from './utils'; export default function getAction(effects, model, onError, onEffect) { let actions = {}; for (const key in effects) { if (Object.prototype.hasOwnProperty.call(effects, key)) { actions[key] = getSingleAction( key, effects[key], model, onError, onEffect ); } } return actions; } function getSingleAction(key, effect, model, onError, onEffect) { invariant(isFunction(effect), '[model.action]: action should be function'); let actionWithCatch = async function(action, { dispatch, ...rest }) { try { dispatch = prefixedDispatch(dispatch, model); return await effect(action, { dispatch, ...rest }); } catch (e) { onError(e, { key, actionArgs: arguments, }); if (!e._dontReject) { throw e; } } }; const actionWithOnEffect = applyOnEffect( onEffect, actionWithCatch, model, key ); return actionWithOnEffect; } function applyOnEffect(fns, effect, model, key) { for (const fn of fns) { effect = fn(effect, model, key); } return effect; }