'use client'; import * as React from 'react'; import { useRouter } from 'next/navigation'; import Alert from '@mui/material/Alert'; import { config } from '@/config'; import { paths } from '@/paths'; import { AuthStrategy } from '@/lib/auth/strategy'; import { logger } from '@/lib/default-logger'; import { useUser } from '@/hooks/use-user'; export interface AuthGuardProps { children: React.ReactNode; } export function AuthGuard({ children }: AuthGuardProps): React.JSX.Element | null { const router = useRouter(); const { user, error, isLoading } = useUser(); const [isChecking, setIsChecking] = React.useState(true); const checkPermissions = async (): Promise => { if (isLoading) { return; } if (error) { setIsChecking(false); return; } // NOTE: here state that if user = null, eject user to login page if (!user) { logger.debug('[AuthGuard]: User is not logged in, redirecting to sign in'); switch (config.auth.strategy) { case AuthStrategy.CUSTOM: { router.replace(paths.auth.custom.signIn); return; } case AuthStrategy.AUTH0: { router.replace(paths.auth.auth0.signIn); return; } case AuthStrategy.COGNITO: { router.replace(paths.auth.cognito.signIn); return; } case AuthStrategy.FIREBASE: { router.replace(paths.auth.firebase.signIn); return; } case AuthStrategy.SUPABASE: { router.replace(paths.auth.supabase.signIn); return; } default: { logger.error('[AuthGuard]: Unknown auth strategy'); return; } } } setIsChecking(false); }; React.useEffect(() => { checkPermissions().catch(() => { // noop }); // eslint-disable-next-line react-hooks/exhaustive-deps -- Expected }, [user, error, isLoading]); if (isChecking) { return null; } if (error) { return {error}; } return {children}; }