import { Map, List, fromJS } from "immutable"; import jwtDecode from "jwt-decode"; import Cookies from "universal-cookie"; const defaultState = Map({ error: "", loading: false, username: "", isAdmin: false, isActivated: false, isTokenSet: false, isLogged: false, polochonToken: "", polochonUrl: "", polochonName: "", polochonId: "", polochonActivated: false, tokens: List(), modules: Map(), modulesLoading: false, }); let initialState = defaultState; const token = localStorage.getItem("token"); if (token && token !== "") { initialState = updateFromToken(initialState, token); } const handlers = { USER_LOGIN_PENDING: (state) => state.set("loading", true), USER_LOGIN_ERROR: (state, action) => { state.set("loading", false); return logoutUser(action.payload.response.message); }, USER_LOGIN_FULFILLED: (state, action) => { return updateFromToken(state, action.payload.response.data.token); }, USER_SIGNUP_PENDING: (state) => state.set("loading", true), USER_SIGNUP_ERROR: (state, action) => state.merge( Map({ error: action.payload.response.message, loading: false, }) ), USER_SIGNUP_FULFILLED: (state) => state.merge(Map({ error: "", loading: false })), USER_SET_TOKEN: (state, action) => updateFromToken(state, action.payload.token), USER_LOGOUT: () => logoutUser(), GET_USER_PENDING: (state) => state.set("loading", true), GET_USER_FULFILLED: (state, action) => state.merge( Map({ polochonToken: action.payload.response.data.token, polochonUrl: action.payload.response.data.url, polochonName: action.payload.response.data.name, polochonId: action.payload.response.data.id, polochonActivated: action.payload.response.data.activated, loading: false, }) ), GET_USER_TOKENS_PENDING: (state) => state.set("loading", true), GET_USER_TOKENS_FULFILLED: (state, action) => state.merge( Map({ tokens: fromJS(action.payload.response.data), loading: false, }) ), GET_USER_MODULES_PENDING: (state) => state.set("modulesLoading", true), GET_USER_MODULES_FULFILLED: (state, action) => state.merge( Map({ modules: fromJS(action.payload.response.data), modulesLoading: false, }) ), }; function logoutUser(error) { localStorage.removeItem("token"); const cookies = new Cookies(); cookies.remove("token"); if (error !== "") { return defaultState.set("error", error); } else { 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({ error: "", isLogged: true, isTokenSet: true, isAdmin: decodedToken.isAdmin, isActivated: decodedToken.isActivated, username: decodedToken.username, }) ); } export default (state = initialState, action) => handlers[action.type] ? handlers[action.type](state, action) : state;