at the end of the day, it was inevitable
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user