/**
* Protected component to check if the user is authenticated or not and then render the component
* @author Yousuf Kalim
*/
import React, { useEffect, ReactNode, ReactElement } from 'react';
import { Navigate } from 'react-router-dom';
import { Auth, Config } from '../Store';
import Loader from './Loader';
/**
* Protected
* @param failureRedirect {string} - The path to redirect if the user is not authenticated
* @param roles
* @param children {ReactNode} - The component to render if the user is authenticated
* @returns {ReactElement}
*/
function Protected({
failureRedirect = '/',
roles,
children,
}: {
failureRedirect?: string;
roles?: string[];
children: ReactNode;
}): ReactElement {
const { auth, setAuth } = Auth(); // Get the auth state from the store
const {
config: { isAuthenticated, showLoader },
} = Config(); // Get the config from the store
useEffect(() => {
// Check if the user is authenticated or not
if (isAuthenticated) {
isAuthenticated()
.then((res: any) => {
if (res) {
if (roles?.length && roles.includes(res.role)) {
// If the user is authenticated then set the auth state to true
return setAuth(true);
} else if (!roles?.length) {
// If the user is authenticated then set the auth state to true
setAuth(true);
} else {
setAuth(false);
}
} else {
setAuth(false);
}
})
.catch(() => setAuth(false)); // If the user is not authenticated then set the auth state to false
} else {
setAuth(false);
}
}, [isAuthenticated, setAuth]);
// eslint-disable-next-line no-nested-ternary
return auth === null ? ( // If the auth state is null then show the loader
showLoader &&
) : auth ? ( // If the auth state is true then render the children
children
) : (
// If the auth state is false then redirect to the failureRedirect path
);
}
export default Protected;