UNPKG

redux-promise-loading

Version:

Redux middleware and reducer for handling redux promise loading indicator

78 lines (67 loc) 2.17 kB
'use strict'; 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); }; }; }; }