import { useEffect, useState } from 'react'; import { SplashScreen } from 'src/components/loading-screen'; import { CONFIG } from 'src/global-config'; import { usePathname, useRouter } from 'src/routes/hooks'; import { paths } from 'src/routes/paths'; import { useAuthContext } from '../hooks'; // ---------------------------------------------------------------------- type AuthGuardProps = { children: React.ReactNode; }; const signInPaths = { jwt: paths.auth.jwt.signIn, auth0: paths.auth.auth0.signIn, amplify: paths.auth.amplify.signIn, firebase: paths.auth.firebase.signIn, supabase: paths.auth.supabase.signIn, }; export function AuthGuard({ children }: AuthGuardProps) { const router = useRouter(); const pathname = usePathname(); const { authenticated, loading } = useAuthContext(); const [isChecking, setIsChecking] = useState(true); const createRedirectPath = (currentPath: string) => { const queryString = new URLSearchParams({ returnTo: pathname }).toString(); return `${currentPath}?${queryString}`; }; const checkPermissions = async (): Promise => { if (loading) { return; } if (!authenticated) { const { method } = CONFIG.auth; const signInPath = signInPaths[method]; const redirectPath = createRedirectPath(signInPath); router.replace(redirectPath); return; } setIsChecking(false); }; useEffect(() => { checkPermissions(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [authenticated, loading]); if (isChecking) { return ; } return <>{children}; }