import { produce } from "immer"; import jwtDecode from "jwt-decode"; import Cookies from "universal-cookie"; const defaultState = { error: "", loading: false, username: "", isAdmin: false, isActivated: false, isTokenSet: false, isLogged: false, polochonToken: "", polochonUrl: "", polochonName: "", polochonId: "", polochonActivated: false, tokens: [], modules: {}, modulesLoading: false, }; const logoutUser = () => { localStorage.removeItem("token"); const cookies = new Cookies(); cookies.remove("token"); }; const updateFromToken = (draft, token) => { const decodedToken = jwtDecode(token); localStorage.setItem("token", token); const cookies = new Cookies(); cookies.set("token", token); draft.error = ""; draft.isLogged = true; draft.isTokenSet = true; draft.isAdmin = decodedToken.isAdmin; draft.isActivated = decodedToken.isActivated; draft.username = decodedToken.username; }; // Initial state is the default state with the info from the current user // token let initialState = defaultState; const token = localStorage.getItem("token"); if (token && token !== "") { updateFromToken(initialState, token); } export default (state = initialState, action) => produce(state, (draft) => { switch (action.type) { case "USER_SIGNUP_PENDING": case "USER_LOGIN_PENDING": case "GET_USER_PENDING": case "GET_USER_TOKENS_PENDING": draft.loading = true; break; case "USER_LOGIN_ERROR": logoutUser(); draft.isLogged = false; draft.loading = false; draft.error = action.payload.response.message; break; case "USER_LOGIN_FULFILLED": draft.loading = false; updateFromToken(draft, action.payload.response.data.token); break; case "USER_SIGNUP_ERROR": draft.error = action.payload.response.message; draft.loading = false; break; case "USER_SIGNUP_FULFILLED": draft.error = ""; draft.loading = false; break; case "USER_SET_TOKEN": updateFromToken(draft, action.payload.token); break; case "USER_LOGOUT": logoutUser(); draft.isLogged = false; break; case "GET_USER_FULFILLED": draft.polochonToken = action.payload.response.data.token; draft.polochonUrl = action.payload.response.data.url; draft.polochonName = action.payload.response.data.name; draft.polochonId = action.payload.response.data.id; draft.polochonActivated = action.payload.response.data.activated; draft.loading = false; break; case "GET_USER_TOKENS_FULFILLED": draft.tokens = action.payload.response.data; draft.loading = false; break; case "GET_USER_MODULES_PENDING": draft.modulesLoading = true; break; case "GET_USER_MODULES_FULFILLED": draft.modules = action.payload.response.data; draft.modulesLoading = false; break; } });