UNPKG

redux-pack

Version:

Sensible promise handling and middleware for redux

98 lines (65 loc) 2.69 kB
var _extends=Object.assign||function(target){for(var i=1;i<arguments.length;i++){var source=arguments[i];for(var key in source){if(Object.prototype.hasOwnProperty.call(source,key)){target[key]=source[key];}}}return target;};var _uuid=require('uuid');var _uuid2=_interopRequireDefault(_uuid); var _constants=require('./constants');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;} function isPromise(obj){ return!!obj&&typeof obj.then==='function'; } function handleEventHook(meta,hook){ if(meta&&meta[hook]&&typeof meta[hook]==='function'){ try{for(var _len=arguments.length,args=Array(_len>2?_len-2:0),_key=2;_key<_len;_key++){args[_key-2]=arguments[_key];} meta[hook].apply(meta,args); }catch(e){ console.error(e); } } } function handlePromise(dispatch,getState,action){var _extends2;var promise=action.promise,type=action.type,payload=action.payload,meta=action.meta; var transactionId=_uuid2.default.v4(); var startPayload=payload; dispatch({ type:type, payload:payload, meta:_extends({}, meta,(_extends2={},_defineProperty(_extends2, _constants.KEY.LIFECYCLE,_constants.LIFECYCLE.START),_defineProperty(_extends2, _constants.KEY.TRANSACTION,transactionId),_extends2))}); handleEventHook(meta,'onStart',payload,getState); var success=function success(data){var _extends3; dispatch({ type:type, payload:data, meta:_extends({}, meta,(_extends3={ startPayload:startPayload},_defineProperty(_extends3, _constants.KEY.LIFECYCLE,_constants.LIFECYCLE.SUCCESS),_defineProperty(_extends3, _constants.KEY.TRANSACTION,transactionId),_extends3))}); handleEventHook(meta,'onSuccess',data,getState); handleEventHook(meta,'onFinish',true,getState); return{payload:data}; }; var failure=function failure(error){var _extends4; dispatch({ type:type, payload:error, error:true, meta:_extends({}, meta,(_extends4={ startPayload:startPayload},_defineProperty(_extends4, _constants.KEY.LIFECYCLE,_constants.LIFECYCLE.FAILURE),_defineProperty(_extends4, _constants.KEY.TRANSACTION,transactionId),_extends4))}); handleEventHook(meta,'onFailure',error,getState); handleEventHook(meta,'onFinish',false,getState); return{error:true,payload:error}; }; return promise.then(success,failure); } var middleware=function middleware(store){return function(next){return function(action){ if(action==null){ return null; } if(isPromise(action.promise)){ return handlePromise(store.dispatch,store.getState,action); } return next(action); };};}; module.exports=middleware;