canape/frontend/js/auth.js
Grégoire Delattre 4b26080193
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
Update redux state management
Use immer with native javascript objects instead of immutablejs.
2020-04-07 18:22:26 +02:00

70 lines
1.6 KiB
JavaScript

import React from "react";
import PropTypes from "prop-types";
import { useDispatch, useSelector } from "react-redux";
import { Route, Redirect } from "react-router-dom";
import { setUserToken } from "./actions/users";
export const ProtectedRoute = ({ component: Component, ...otherProps }) => {
const dispatch = useDispatch();
const isLogged = useSelector((state) => state.user.isLogged);
const isActivated = useSelector((state) => state.user.isActivated);
const isTokenSet = useSelector((state) => state.user.isTokenSet);
const isAuthenticated = () => {
if (isTokenSet) {
return true;
}
const token = localStorage.getItem("token");
if (isLogged || (token && token !== "")) {
if (!isTokenSet) {
dispatch(setUserToken(token));
}
return true;
}
return false;
};
return (
<Route
{...otherProps}
render={(props) => {
if (isAuthenticated()) {
if (isActivated) {
return <Component {...props} />;
} else {
return <Redirect to="/users/activation" />;
}
} else {
return <Redirect to="/users/login" />;
}
}}
/>
);
};
ProtectedRoute.propTypes = {
component: PropTypes.func,
};
export const AdminRoute = ({ component: Component, ...otherProps }) => {
const isAdmin = useSelector((state) => state.user.isAdmin);
return (
<Route
{...otherProps}
render={(props) => {
if (isAdmin) {
return <Component {...props} />;
} else {
return <Redirect to="/" />;
}
}}
/>
);
};
AdminRoute.propTypes = {
component: PropTypes.func,
};