70 lines
1.6 KiB
JavaScript
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,
|
|
};
|