173 lines
5.1 KiB
JavaScript
173 lines
5.1 KiB
JavaScript
import * as api from '../../../api/loginApi';
|
|
import $ from 'jquery';
|
|
import reduxModule from '../abstract/reduxModule';
|
|
import { tokenInject } from '../../utils/common';
|
|
import { addAlert } from './alerts';
|
|
import Cookies from 'cookies-js';
|
|
import axios from 'axios';
|
|
// import { TOGGLE_UPGRADE_PLAN } from './base';
|
|
|
|
const ACTIONS = {
|
|
PENDING: 'Login pending',
|
|
SAVE_USER_DATA: 'Save user data',
|
|
SET_FORM_ERROR: 'Set form error',
|
|
SET_RESTRICTIONS: 'Set user restrictions'
|
|
};
|
|
|
|
export const AuthNS = '[Auth]';
|
|
export const USER_LOGOUT = 'Logout user';
|
|
const REFRESH_TOKEN = 'refreshToken';
|
|
|
|
class Auth extends reduxModule {
|
|
getNamespace() {
|
|
return AuthNS;
|
|
}
|
|
|
|
getInitialState() {
|
|
return {
|
|
form: {
|
|
error: ''
|
|
},
|
|
isAuthPending: true,
|
|
token: '',
|
|
refreshToken: '',
|
|
user: {},
|
|
userSubscription: '15d',
|
|
userSubscriptionDate: '2017-03-01'
|
|
};
|
|
}
|
|
|
|
saveRefreshToken(refreshToken, rememberMe) {
|
|
if (rememberMe) {
|
|
localStorage.setItem(REFRESH_TOKEN, refreshToken);
|
|
} else {
|
|
Cookies.set(REFRESH_TOKEN, refreshToken);
|
|
}
|
|
}
|
|
|
|
clearRefreshToken() {
|
|
localStorage.removeItem(REFRESH_TOKEN);
|
|
delete axios.defaults.headers.common['Authorization'];
|
|
Cookies.expire(REFRESH_TOKEN);
|
|
}
|
|
|
|
getRefreshToken() {
|
|
return Cookies.get(REFRESH_TOKEN) || localStorage.getItem(REFRESH_TOKEN);
|
|
}
|
|
|
|
loginRequest(dispatch, promise, rememberMe) {
|
|
dispatch(this.loginPending(true));
|
|
return promise
|
|
.then((data) => {
|
|
const { token, refreshToken, user } = data;
|
|
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; // to call api with axios
|
|
this.saveRefreshToken(data.refreshToken, rememberMe);
|
|
dispatch(this.saveUserData({ token, refreshToken, user }));
|
|
dispatch(this.loginPending(false));
|
|
dispatch(this.authSetError(''));
|
|
// history.replace(location); //rerun auth guards for routes
|
|
})
|
|
.catch((error) => {
|
|
dispatch(this.authSetError(error.msg));
|
|
dispatch(this.loginPending(false));
|
|
delete axios.defaults.headers.common['Authorization'];
|
|
// history.replace(location); //rerun auth guards for routes
|
|
});
|
|
}
|
|
|
|
refreshLogin = () => {
|
|
return (dispatch) => {
|
|
const refreshToken = this.getRefreshToken();
|
|
if (refreshToken) {
|
|
this.loginRequest(dispatch, api.loginRefresh(refreshToken));
|
|
} else {
|
|
dispatch(this.loginPending(false));
|
|
// history.replace(location); //rerun auth guards for routes
|
|
}
|
|
};
|
|
};
|
|
|
|
login = (email, password, rememberMe) => {
|
|
return (dispatch) => {
|
|
const validateEmail = /^(([^<>()[\]\\.,;:\s@]+(\.[^<>()[\]\\.,;:\s@]+)*)|(.+))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
const isEmailValid = validateEmail.test(email);
|
|
if (isEmailValid) {
|
|
this.loginRequest(dispatch, api.login({ email, password }), rememberMe);
|
|
} else {
|
|
dispatch(this.loginPending(false));
|
|
dispatch(this.authSetError('Please enter valid email address'));
|
|
}
|
|
};
|
|
};
|
|
|
|
logout = () => {
|
|
return (dispatch) => {
|
|
this.clearRefreshToken();
|
|
// dispatch(this.saveUserData({ token: '' }));
|
|
dispatch(this.userLogout(true));
|
|
dispatch(this.loginPending(false));
|
|
// history.push('/auth');
|
|
};
|
|
};
|
|
|
|
getRestrictions = () =>
|
|
tokenInject((dispatch, getState, token) => {
|
|
api
|
|
.getRestrictions(token)
|
|
.then((data) => {
|
|
dispatch(this.setRestrictions(data));
|
|
})
|
|
.catch((errors) => {
|
|
dispatch(addAlert(errors));
|
|
});
|
|
});
|
|
|
|
handleErrors = () => (dispatch) => {
|
|
$(document).ajaxError((event, jqXHR, settings, thrownError) => {
|
|
if (jqXHR.status === 402) {
|
|
const response = jqXHR.responseJSON;
|
|
const failedRestriction = response.failedRestriction;
|
|
const restrictions = response.restrictions;
|
|
const limit = restrictions.limits[failedRestriction];
|
|
if (limit) {
|
|
dispatch(this.setRestrictions(restrictions));
|
|
// dispatch({ type: `[Base] ${TOGGLE_UPGRADE_PLAN}`, payload: true }); // uncomment when upgrade page is ready
|
|
dispatch(
|
|
addAlert({
|
|
type: 'error',
|
|
transKey: 'restriction',
|
|
id: 'restriction'
|
|
})
|
|
);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
defineActions() {
|
|
this.loginPending = this.set(ACTIONS.PENDING, 'isAuthPending');
|
|
this.saveUserData = this.merge(ACTIONS.SAVE_USER_DATA);
|
|
this.authSetError = this.setIn(ACTIONS.SET_FORM_ERROR, ['form', 'error']);
|
|
this.setRestrictions = this.mergeIn(ACTIONS.SET_RESTRICTIONS, [
|
|
'user',
|
|
'restrictions'
|
|
]);
|
|
this.userLogout = this.set(USER_LOGOUT, 'userLogout');
|
|
|
|
return {
|
|
login: this.login,
|
|
logout: this.logout,
|
|
refreshLogin: this.refreshLogin,
|
|
authSetError: this.authSetError,
|
|
handleErrors: this.handleErrors,
|
|
getRestrictions: this.getRestrictions
|
|
};
|
|
}
|
|
}
|
|
|
|
const auth = new Auth();
|
|
auth.init();
|
|
|
|
export const getRestrictions = auth.actions.getRestrictions;
|
|
export default auth;
|