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); }