import { Map, List, fromJS } from "immutable" import jwtDecode from "jwt-decode" import Cookies from "universal-cookie" const defaultState = Map({ loading: false, username: "", isAdmin: false, isActivated: false, isLogged: false, polochonToken: "", polochonUrl: "", tokens: List(), }); const handlers = { "USER_LOGIN_PENDING": state => state.set("loading", true), "USER_LOGIN_ERROR": state => { state.set("loading", false) return logoutUser() }, "USER_LOGIN_FULFILLED": (state, action) => { return updateFromToken(state, action.payload.response.data.token) }, "USER_SET_TOKEN": (state, action) => updateFromToken(state, action.payload.token), "USER_LOGOUT": () => logoutUser(), "GET_USER_FULFILLED": (state, action) => state.merge(Map({ polochonToken: action.payload.response.data.token, polochonUrl: action.payload.response.data.url, })), "GET_USER_TOKENS_FULFILLED": (state, action) => state.set( "tokens", fromJS(action.payload.response.data) ), } function logoutUser() { localStorage.removeItem("token"); const cookies = new Cookies(); cookies.remove("token"); return defaultState } function updateFromToken(state, token) { const decodedToken = jwtDecode(token); localStorage.setItem("token", token); const cookies = new Cookies(); cookies.set("token", token); return state.merge(Map({ userLoading: false, isLogged: true, isAdmin: decodedToken.isAdmin, isActivated: decodedToken.isActivated, username: decodedToken.username, })) } export default (state = defaultState, action) => handlers[action.type] ? handlers[action.type](state, action) : state;