Skip to content
Snippets Groups Projects

Move back cookie fetch to SignInForm. Role fetched and saved into a Context. Small refactorings.

Merged Defendi Alberto requested to merge feature/role into dev
10 files
+ 122
179
Compare changes
  • Side-by-side
  • Inline
Files
10
import React, { useState, useEffect } from 'react';
import React, { useState, useEffect, useContext } from 'react';
import axios from 'axios';
import axios from 'axios';
import { Route, Redirect, RouteProps } from 'react-router-dom';
import { Route, Redirect, RouteProps } from 'react-router-dom';
import { NonAuthRoutes } from 'api/routes';
import { NonAuthRoutes } from 'api/routes';
 
import { AuthContext } from 'components/AuthUser/AuthContext';
 
import { Roles } from 'api/userRoles';
/**
/**
* A wrapper for <Route> that redirects to the login screen if you're not yet authenticated.
* A wrapper for <Route> that redirects to the login screen if you're not yet authenticated.
 
* Every non-public route must be wrapped with this component.
* */
* */
type Props = {
type Props = {
@@ -20,27 +23,28 @@ export const PrivateRoute = ({
@@ -20,27 +23,28 @@ export const PrivateRoute = ({
requiredRoles,
requiredRoles,
}: Props): JSX.Element => {
}: Props): JSX.Element => {
const [auth, setAuth] = useState<boolean>(false);
const [auth, setAuth] = useState<boolean>(false);
const [loading, setLoading] = useState<boolean>(false);
const { role } = useContext(AuthContext);
useEffect(() => {
useEffect(() => {
const fetch = async (): Promise<unknown> => {
const fetch = async (): Promise<unknown> => {
const result = await axios('/api/web/login/is_authenticated');
const result = await axios('/api/web/login/is_authenticated');
setAuth(result.data.is_authenticated);
setAuth(result.data.is_authenticated);
setLoading(true);
return null;
return null;
};
};
fetch();
/*
}, []);
Check if user is logged in.
Avoiding this condition would call is\_authenticated every time
const currentRole = String(sessionStorage.getItem('ROLE'));
this component state is triggered, falling in unnecessary calls to the
const userHasRequiredRole = requiredRoles.includes(currentRole);
server.
 
*/
 
if (role !== Roles.visitor) fetch();
 
}, [auth]);
 
const userHasRequiredRole = requiredRoles.includes(role);
const message = userHasRequiredRole
const message = userHasRequiredRole
? 'Please log in to view this page'
? 'Please log in to view this page'
: 'Your role is not allowed';
: 'Your role is not allowed';
return !loading ? (
return (
<p>loading</p>
) : (
<Route
<Route
exact={false}
exact={false}
path={path}
path={path}
@@ -51,7 +55,7 @@ export const PrivateRoute = ({
@@ -51,7 +55,7 @@ export const PrivateRoute = ({
<Redirect
<Redirect
to={{
to={{
pathname: userHasRequiredRole
pathname: userHasRequiredRole
? NonAuthRoutes.signIn
? `${NonAuthRoutes.auth}${NonAuthRoutes.signIn}`
: NonAuthRoutes.unauthorized,
: NonAuthRoutes.unauthorized,
state: {
state: {
message,
message,
Loading