93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
import Router from 'next/router';
|
|
import axios from 'axios';
|
|
import cookie from 'js-cookie';
|
|
import decodeJwt from 'jwt-decode';
|
|
import {
|
|
SET_DOMAIN,
|
|
SHOW_PAGE_LOADING,
|
|
HIDE_PAGE_LOADING,
|
|
AUTH_USER,
|
|
UNAUTH_USER,
|
|
SENT_VERIFICATION,
|
|
AUTH_ERROR,
|
|
LOGIN_LOADING,
|
|
SIGNUP_LOADING,
|
|
AUTH_RENEW,
|
|
} from './actionTypes';
|
|
|
|
const setDomain = payload => ({ type: SET_DOMAIN, payload });
|
|
|
|
export const showPageLoading = () => ({ type: SHOW_PAGE_LOADING });
|
|
export const hidePageLoading = () => ({ type: HIDE_PAGE_LOADING });
|
|
export const authUser = payload => ({ type: AUTH_USER, payload });
|
|
export const unauthUser = () => ({ type: UNAUTH_USER });
|
|
export const sentVerification = payload => ({
|
|
type: SENT_VERIFICATION,
|
|
payload,
|
|
});
|
|
export const showAuthError = payload => ({ type: AUTH_ERROR, payload });
|
|
export const showLoginLoading = () => ({ type: LOGIN_LOADING });
|
|
export const showSignupLoading = () => ({ type: SIGNUP_LOADING });
|
|
export const authRenew = () => ({ type: AUTH_RENEW });
|
|
|
|
export const signupUser = payload => async dispatch => {
|
|
dispatch(showSignupLoading());
|
|
try {
|
|
const {
|
|
data: { email },
|
|
} = await axios.post('/api/auth/signup', payload);
|
|
dispatch(sentVerification(email));
|
|
} catch ({ response }) {
|
|
dispatch(showAuthError(response.data.error));
|
|
}
|
|
};
|
|
|
|
export const loginUser = payload => async dispatch => {
|
|
dispatch(showLoginLoading());
|
|
try {
|
|
const {
|
|
data: { token },
|
|
} = await axios.post('/api/auth/login', payload);
|
|
cookie.set('token', token, { expires: 7 });
|
|
dispatch(authRenew());
|
|
dispatch(authUser(decodeJwt(token)));
|
|
dispatch(setDomain({ customDomain: decodeJwt(token).domain }));
|
|
dispatch(showPageLoading());
|
|
Router.push('/');
|
|
} catch ({ response }) {
|
|
dispatch(showAuthError(response.data.error));
|
|
}
|
|
};
|
|
|
|
export const logoutUser = () => dispatch => {
|
|
dispatch(showPageLoading());
|
|
cookie.remove('token');
|
|
dispatch(unauthUser());
|
|
Router.push('/login');
|
|
};
|
|
|
|
export const renewAuthUser = () => async (dispatch, getState) => {
|
|
if (getState().auth.renew) {
|
|
return;
|
|
}
|
|
|
|
const options = {
|
|
method: 'POST',
|
|
headers: { Authorization: cookie.get('token') },
|
|
url: '/api/auth/renew',
|
|
};
|
|
|
|
try {
|
|
const {
|
|
data: { token },
|
|
} = await axios(options);
|
|
cookie.set('token', token, { expires: 7 });
|
|
dispatch(authRenew());
|
|
dispatch(authUser(decodeJwt(token)));
|
|
dispatch(setDomain({ customDomain: decodeJwt(token).domain }));
|
|
} catch (error) {
|
|
cookie.remove('token');
|
|
dispatch(unauthUser());
|
|
}
|
|
};
|