import axios from 'axios'; import {createAction} from 'redux-actions'; export default store => next => action => { const {dispatch} = store; if (action.payload && action.payload.axios) { return new Promise((res, rej) => { const apiToken = store.getState().apiToken; const payload = { ...action.payload.axios, headers: { ...action.payload.axios.headers, authorization: apiToken ? `Bearer ${apiToken}` : null, }, }; axios(payload) .then(response => { const success = createAction( `${action.type}_SUCCESS`, axiosResponse => ({ ...action.payload, axios: undefined, axiosResponse, }) )(response.data); if (action.payload.onSuccess) { action.payload.onSuccess(response.data); } res(success); return dispatch(success); }) .catch(error => { const failed = createAction( `${action.type}_FAILED`, axiosError => ({ ...action.payload, axios: undefined, axiosError, }) )(error); if (action.payload.onError) { action.payload.onError(error); } rej(failed); return dispatch(failed); }); }); } return next(action); };