var {handleResponse} = require('.utils') var {setErrorMessages} = require('./messages') var CHECK_TOKEN = 'auth/CHECK_TOKEN' var CHECK_TOKEN_FAILURE = 'auth/CHECK_TOKEN_FAILURE' var CHECK_TOKEN_SUCCESS = 'auth/CHECK_TOKEN_SUCCESS' var LOGIN = 'auth/LOGIN' var LOGIN_FAILURE = 'auth/LOGIN_FAILURE' var LOGIN_SUCCESS = 'auth/LOGIN_SUCCESS' var SHOWED_WELCOME = 'auth/SHOWED_WELCOME' var LOGOUT = 'auth/LOGOUT' var json = window.localStorage.auth var initialState = json ? JSON.parse(json) : {token: null, user: null} function auth(state={ // eslint-disable-line space-infix-ops ...initialState, checkingToken: false, loggingIn: false, showWelcome: false }, action) { switch (action.type) { case CHECK_TOKEN: return {...state, checkingToken: true} case CHECK_TOKEN_FAILURE: case CHECK_TOKEN_SUCCESS: return {...state, checkingToken: false} case LOGIN: return {...state, loggingIn: true} case LOGIN_FAILURE: return {...state, loggingIn: false} case LOGIN_SUCCESS: window.localStorage.auth = JSON.stringify(action.payload) return {...state, loggingIn: false, showWelcome: true, ...action.payload} case SHOWED_WELCOME: return {...state, showWelcome: false} case LOGOUT: delete window.localStorage.auth return {...state, token: null, user: null} } return state } auth.checkToken = () => (dispatch, getState) => { dispatch({type: CHECK_TOKEN}) window.fetch('/api/check-token', { headers: { 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify({token: getState().auth.token}) }) .then(handleResponse) .then(({valid}) => { if (!valid) { dispatch(auth.logout()) dispatch(setErrorMessages(['Login expired - please log in again.'])) } dispatch({type: CHECK_TOKEN_SUCCESS}) }) .catch(error => { dispatch(setErrorMessages([`Error checking authentication token: ${error.message}`])) dispatch({type: CHECK_TOKEN_FAILURE}) }) } auth.login = (username, password) => dispatch => { dispatch({type: LOGIN}) window.fetch('/api/authenticate', { headers: { 'Content-Type': 'application/json' }, method: 'POST', body: JSON.stringify({username, password}) }) .then(handleResponse) .then(payload => dispatch({type: LOGIN_SUCCESS, payload})) .catch(error => { dispatch(setErrorMessages([`Error logging in: ${error.message}`])) dispatch({type: LOGIN_FAILURE}) }) } auth.logout = () => ({type: LOGOUT}) auth.showedWelcome = () => ({type: SHOWED_WELCOME}) auth.LOGOUT = LOGOUT module.exports = auth