| 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"; |
| import { KeyboardShortcutWrapper } from "@/utils/keyboardShortcuts"; |
|
|
| |
| |
| 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); |
|
|
| |
| if ( |
| !MultiUserMode && |
| !RequiresAuth && |
| !LLMProvider && |
| !VectorDB |
| ) { |
| setShouldRedirectToOnboarding(true); |
| setIsAuthed(true); |
| return; |
| } |
|
|
| if (!MultiUserMode && !RequiresAuth) { |
| setIsAuthed(true); |
| return; |
| } |
|
|
| |
| 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 }; |
| } |
|
|
| |
| |
| export function AdminRoute({ Component, hideUserMenu = false }) { |
| const { isAuthd, shouldRedirectToOnboarding, multiUserMode } = |
| useIsAuthenticated(); |
| if (isAuthd === null) return <FullScreenLoader />; |
|
|
| if (shouldRedirectToOnboarding) { |
| return <Navigate to={paths.onboarding.home()} />; |
| } |
|
|
| const user = userFromStorage(); |
| return isAuthd && (user?.role === "admin" || !multiUserMode) ? ( |
| hideUserMenu ? ( |
| <KeyboardShortcutWrapper> |
| <Component /> |
| </KeyboardShortcutWrapper> |
| ) : ( |
| <KeyboardShortcutWrapper> |
| <UserMenu> |
| <Component /> |
| </UserMenu> |
| </KeyboardShortcutWrapper> |
| ) |
| ) : ( |
| <Navigate to={paths.home()} /> |
| ); |
| } |
|
|
| |
| |
| export function ManagerRoute({ Component }) { |
| const { isAuthd, shouldRedirectToOnboarding, multiUserMode } = |
| useIsAuthenticated(); |
| if (isAuthd === null) return <FullScreenLoader />; |
|
|
| if (shouldRedirectToOnboarding) { |
| return <Navigate to={paths.onboarding.home()} />; |
| } |
|
|
| const user = userFromStorage(); |
| return isAuthd && (user?.role !== "default" || !multiUserMode) ? ( |
| <KeyboardShortcutWrapper> |
| <UserMenu> |
| <Component /> |
| </UserMenu> |
| </KeyboardShortcutWrapper> |
| ) : ( |
| <Navigate to={paths.home()} /> |
| ); |
| } |
|
|
| export default function PrivateRoute({ Component }) { |
| const { isAuthd, shouldRedirectToOnboarding } = useIsAuthenticated(); |
| if (isAuthd === null) return <FullScreenLoader />; |
|
|
| if (shouldRedirectToOnboarding) { |
| return <Navigate to="/onboarding" />; |
| } |
|
|
| return isAuthd ? ( |
| <KeyboardShortcutWrapper> |
| <UserMenu> |
| <Component /> |
| </UserMenu> |
| </KeyboardShortcutWrapper> |
| ) : ( |
| <Navigate to={paths.login(true)} /> |
| ); |
| } |
|
|