smarti/src/actions/authActions.js
2020-12-03 11:17:39 +01:00

185 lines
5.5 KiB
JavaScript

import { USER_LOADED, USER_LOADING, AUTH_ERROR, LOGIN_SUCCESS, LOGIN_FAIL, LOGOUT_SUCCESS, LOGOUT_FAIL, REFRESH_TOKEN_SUCCESS } from '../actions/types';
import axios from 'axios';
import { returnErrors, returnSuccess } from './messageActions'
// // Check token & load user
// export const loadUser = () => (dispatch) => {
// // user loading
// dispatch({
// type: USER_LOADING
// });
// const config = {
// success: res => {
// dispatch({
// type: USER_LOADED,
// payload: res.data.user
// });
// },
// error: err => {
// if(err.response){
// dispatch(returnErrors(err.response.data.message, err.response.status));
// }
// dispatch({
// type: AUTH_ERROR
// });
// }
// };
// axios.get('/api/v1/user/me', config, dispatch(authInterceptor()))
// .then(res => {
// res.config.success(res);
// })
// .catch(err => {
// err.config.error(err);
// });
// };
var logoutTimerId;
const timeToLogout = 14.9*60*1000; // nearly 15 minutes corresponding to the API
// Login user
export const login = ({ email, password }) => (dispatch) => {
// Headers
const config = {
headers: {
'Content-Type': 'application/json'
}
};
// Request Body
const body = JSON.stringify({ email, password });
axios.post('https://api.opensensemap.org/users/sign-in', body, config)
.then(res => {
// Logout automatically if refreshToken "expired"
const logoutTimer = () => setTimeout(
() => dispatch(logout()),
timeToLogout
);
logoutTimerId = logoutTimer();
dispatch(returnSuccess(res.data.message, res.status, 'LOGIN_SUCCESS'));
dispatch({
type: LOGIN_SUCCESS,
payload: res.data
});
})
.catch(err => {
console.log('hier');
console.log(err);
dispatch(returnErrors(err.response.data.message, err.response.status, 'LOGIN_FAIL'));
dispatch({
type: LOGIN_FAIL
});
});
};
// Logout User
export const logout = () => (dispatch) => {
const config = {
success: res => {
dispatch({
type: LOGOUT_SUCCESS
});
dispatch(returnSuccess(res.data.message, res.status, 'LOGOUT_SUCCESS'));
clearTimeout(logoutTimerId);
},
error: err => {
dispatch(returnErrors(err.response.data.message, err.response.status, 'LOGOUT_FAIL'));
dispatch({
type: LOGOUT_FAIL
});
clearTimeout(logoutTimerId);
}
};
axios.post('https://api.opensensemap.org/users/sign-out', {}, config, dispatch(authInterceptor()))
.then(res => {
res.config.success(res);
})
.catch(err => {
if(err.response.status !== 401){
err.config.error(err);
}
});
};
export const authInterceptor = () => (dispatch, getState) => {
// Add a request interceptor
axios.interceptors.request.use(
config => {
config.headers['Content-Type'] = 'application/json';
const token = getState().auth.token;
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
error => {
Promise.reject(error);
}
);
// Add a response interceptor
axios.interceptors.response.use(
response => {
// request was successfull
return response;
},
error => {
const originalRequest = error.config;
const refreshToken = getState().auth.refreshToken;
if(refreshToken){
// try to refresh the token failed
if (error.response.status === 401 && originalRequest._retry) {
// router.push('/login');
return Promise.reject(error);
}
// token was not valid and 1st try to refresh the token
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const refreshToken = getState().auth.refreshToken;
// request to refresh the token, in request-body is the refreshToken
axios.post('/api/v1/user/token/refresh', {"refreshToken": refreshToken})
.then(res => {
if (res.status === 200) {
clearTimeout(logoutTimerId);
const logoutTimer = () => setTimeout(
() => dispatch(logout()),
timeToLogout
);
logoutTimerId = logoutTimer();
dispatch({
type: REFRESH_TOKEN_SUCCESS,
payload: res.data
});
axios.defaults.headers.common['Authorization'] = 'Bearer ' + getState().auth.token;
// request was successfull, new request with the old parameters and the refreshed token
return axios(originalRequest)
.then(res => {
originalRequest.success(res);
})
.catch(err => {
originalRequest.error(err);
});
}
return Promise.reject(error);
})
.catch(err => {
// request failed, token could not be refreshed
if(err.response){
dispatch(returnErrors(err.response.data.message, err.response.status));
}
dispatch({
type: AUTH_ERROR
});
return Promise.reject(error);
});
}
}
// request status was unequal to 401, no possibility to refresh the token
return Promise.reject(error);
}
);
};