Example of using redux-call-api

August 15, 2016 ยท View on GitHub

import BasicConfig from '../call-api/basic-config' import actionTypes from './action-types' import axiosProvider from '../providers/api' import {LocalStorageTokenProvider, SessionStorageTokenProvider} from '../providers/token' import authConfig from '../auth/config'

const actions = { [actionTypes.doLogin]: { makeApiObj: (action) => { return { actionTypes: actionTypes.login, request: { url: '/auth/login/', method: 'post', data: action.payload }, onSuccess: function(response) { const {remember} = action.payload; setAuthToken(response.data.key, remember); } } } }, [actionTypes.doLogout]: { makeApiObj: () => { return { actionTypes: actionTypes.logout, request: { url: '/auth/logout/', method: 'post', needAuth: true }, onSuccess: function() { authConfig.tokenProvider.setToken(null); } }
}
}, [actionTypes.doUpdateUserInfo]: { makeApiObj: () => { return { actionTypes: actionTypes.updateUserInfo, request: { url: '/auth/user/', needAuth: true } } } }, [actionTypes.doLoadPhotos]: { makeApiObj: () => { return { actionTypes: actionTypes.loadPhotos, request: { url: '/api/photos/' } } } }, [actionTypes.doUploadPhoto]: { makeApiObj: (action) => { return { actionTypes: actionTypes.uploadPhoto, request: { url: '/api/photos/', method: 'post', data: action.payload, needAuth: true } } } }, [actionTypes.doDeletePhoto]: { makeApiObj: (action) => { return { actionTypes: actionTypes.deletePhoto, request: { url: action.payload.url, method: 'delete', needAuth: true } } } }, [actionTypes.doLoadPhoto]: { makeApiObj: (action) => { return { actionTypes: actionTypes.loadPhoto, request: { url: /api/photos/${action.payload.id}/, } } } } };

const config = new BasicConfig(actions, axiosProvider);

const defaultBeforeRequest = config.beforeRequest; config.beforeRequest = (apiObj, dispatch, getState) => { if (apiObj.request.needAuth) { const token = authConfig.tokenProvider.getToken(); apiObj.request.headers = Object.assign({}, apiObj.request.headers, {'Authorization': 'Token ' + token}); } defaultBeforeRequest(apiObj, dispatch, getState); };

const defaultOnSuccess = config.onSuccess; config.onSuccess = (r, a, d, g) => { defaultOnSuccess(r, a, d, g); };

const defaultOnFailure = config.onFailure; config.onFailure = (response, apiObj, dispatch, getState) => { if (response.status && response.status === 401) { dispatch({type: actionTypes.logout.success}); } defaultOnFailure(response, apiObj, dispatch, getState); };

export default config

function setAuthToken(token, remember) { if (remember) { authConfig.tokenProvider = new LocalStorageTokenProvider(); } else { authConfig.tokenProvider = new SessionStorageTokenProvider(); } authConfig.tokenProvider.setToken(token); }