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 ? (
) : (
);
}