@girders-elements/core
Version:
Girders Elements is an architectural framework that assists with building data-driven apps with React or React Native.
66 lines (52 loc) • 2.37 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:true});exports.reducer=exports.middleware=undefined;
var _ramda=require('ramda');var _ramda2=_interopRequireDefault(_ramda);
var _action=require('../action');var actions=_interopRequireWildcard(_action);
var _actions=require('./actions');
var _data=require('../data');var data=_interopRequireWildcard(_data);
var _registry=require('../registry');
var _cursor=require('../impl/cursor');
var _log=require('../impl/log');function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
var updateStateAction='@@girders-elements/_effects.updateState';
var middleware=exports.middleware=_ramda2.default.curry(function(config,store,next,action){var
kernel=config.kernel,effectsRegistry=config.effectsRegistry;
var actionMeta=actions.actionMeta(action);
if(actionMeta==null)return next(action);
var key=_registry.ActionRegistry.keyFromAction(action);
var effect=effectsRegistry.get(key);
var context=kernel.focusOn(actionMeta.keyPath);
if(effect==null&&action.type.startsWith('.')){
var keyFn=function keyFn(el){return _registry.ActionRegistry.keyFor(data.kindOf(el),action.type);};
var entry=(0,_cursor.findParentEntry)(effectsRegistry,keyFn,context.query());
if(entry!=null){var
element=entry.element,eff=entry.entry;
effect=eff;
context=kernel.focusOn(element._keyPath);
}
}
if(effect!=null){
var result=effect(context,action);
if(result&&typeof result.then==='function'){
result.
then(function(updateFn){
if(typeof updateFn==='function'){
context.dispatch({type:updateStateAction,updateFn:updateFn});
}
}).
catch(function(e){
kernel.dispatch({type:_actions.types.fail,error:e});
(0,_log.error)('Exception while executing an effect: ',e);
});
}else if(typeof result==='function'){
context.dispatch({type:updateStateAction,result:result});
}
}else{
return next(action);
}
});
var reducer=exports.reducer=_ramda2.default.curry(function(config,state,action){
if(action.type===updateStateAction){var _actions$actionMeta=
actions.actionMeta(action),keyPath=_actions$actionMeta.keyPath;
return state.updateIn(keyPath,action.updateFn);
}
return state;
});