import { useEffect, useState } from "react"; import { Navigate } from "react-router-dom"; import { FullScreenLoader } from "../Preloader"; import validateSessionTokenForUser from "@/utils/session"; import paths from "@/utils/paths"; import { AUTH_TIMESTAMP, AUTH_TOKEN, AUTH_USER } from "@/utils/constants"; import { userFromStorage } from "@/utils/request"; import System from "@/models/system"; import UserMenu from "../UserMenu"; // Used only for Multi-user mode only as we permission specific pages based on auth role. // When in single user mode we just bypass any authchecks. function useIsAuthenticated() { const [isAuthd, setIsAuthed] = useState(null); const [shouldRedirectToOnboarding, setShouldRedirectToOnboarding] = useState(false); const [multiUserMode, setMultiUserMode] = useState(false); useEffect(() => { const validateSession = async () => { const { MultiUserMode, RequiresAuth, LLMProvider = null, VectorDB = null, } = await System.keys(); setMultiUserMode(MultiUserMode); // Check for the onboarding redirect condition if ( !MultiUserMode && !RequiresAuth && // Not in Multi-user AND no password set. !LLMProvider && !VectorDB ) { setShouldRedirectToOnboarding(true); setIsAuthed(true); return; } if (!MultiUserMode && !RequiresAuth) { setIsAuthed(true); return; } // Single User password mode check if (!MultiUserMode && RequiresAuth) { const localAuthToken = localStorage.getItem(AUTH_TOKEN); if (!localAuthToken) { setIsAuthed(false); return; } const isValid = await validateSessionTokenForUser(); setIsAuthed(isValid); return; } const localUser = localStorage.getItem(AUTH_USER); const localAuthToken = localStorage.getItem(AUTH_TOKEN); if (!localUser || !localAuthToken) { setIsAuthed(false); return; } const isValid = await validateSessionTokenForUser(); if (!isValid) { localStorage.removeItem(AUTH_USER); localStorage.removeItem(AUTH_TOKEN); localStorage.removeItem(AUTH_TIMESTAMP); setIsAuthed(false); return; } setIsAuthed(true); }; validateSession(); }, []); return { isAuthd, shouldRedirectToOnboarding, multiUserMode }; } // Allows only admin to access the route and if in single user mode, // allows all users to access the route export function AdminRoute({ Component }) { const { isAuthd, shouldRedirectToOnboarding, multiUserMode } = useIsAuthenticated(); if (isAuthd === null) return ; if (shouldRedirectToOnboarding) { return ; } const user = userFromStorage(); return isAuthd && (user?.role === "admin" || !multiUserMode) ? ( ) : ( ); } // Allows manager and admin to access the route and if in single user mode, // allows all users to access the route export function ManagerRoute({ Component }) { const { isAuthd, shouldRedirectToOnboarding, multiUserMode } = useIsAuthenticated(); if (isAuthd === null) return ; if (shouldRedirectToOnboarding) { return ; } const user = userFromStorage(); return isAuthd && (user?.role !== "default" || !multiUserMode) ? ( ) : ( ); } export default function PrivateRoute({ Component }) { const { isAuthd, shouldRedirectToOnboarding } = useIsAuthenticated(); if (isAuthd === null) return ; if (shouldRedirectToOnboarding) { return ; } return isAuthd ? ( ) : ( ); }