redux-promise-loading
Version:
Redux middleware and reducer for handling redux promise loading indicator
78 lines (67 loc) • 2.17 kB
JavaScript
;
exports.__esModule = true;
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; };
exports.loadingReducer = loadingReducer;
exports.loadingMiddleware = loadingMiddleware;
var INC = 'loadingReducer/inc';
var DEC = 'loadingReducer/dec';
var initialState = {
isLoading: false,
operationsCount: 0,
loadingTypes: []
};
function loadingReducer() {
var state = arguments.length <= 0 || arguments[0] === undefined ? initialState : arguments[0];
var action = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var operationsCount = state.operationsCount;
var isLoading = state.isLoading;
var loadingTypes = [].concat(state.loadingTypes);
var payload = action.payload;
switch (action.type) {
case INC:
loadingTypes.push(payload);
operationsCount += 1;
return _extends({}, state, {
isLoading: true,
operationsCount: operationsCount,
loadingTypes: loadingTypes
});
case DEC:
var index = loadingTypes.indexOf(payload);
loadingTypes.splice(index, 1);
operationsCount -= 1;
if (operationsCount === 0) {
isLoading = false;
}
return _extends({}, state, {
operationsCount: operationsCount,
isLoading: isLoading,
loadingTypes: loadingTypes
});
default:
return state;
}
}
function isPromise(val) {
return val && typeof val.then === 'function';
}
function loadingMiddleware(options) {
return function (_ref) {
var dispatch = _ref.dispatch;
return function (next) {
return function (action) {
var meta = action.meta;
var payload = action.payload;
var type = action.type;
if (meta && meta.loading) {
if (isPromise(payload)) {
dispatch({ type: INC, payload: type });
} else {
dispatch({ type: DEC, payload: type });
}
}
return next(action);
};
};
};
}