114 lines
3.0 KiB
JavaScript

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;