48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { useEffect, useState } from 'react';
|
|
import { SplashScreen } from 'src/components/loading-screen';
|
|
import { CONFIG } from 'src/global-config';
|
|
import { useSearchParams } from 'src/routes/hooks';
|
|
import { useAuthContext } from '../hooks';
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
type GuestGuardProps = {
|
|
children: React.ReactNode;
|
|
};
|
|
|
|
export function GuestGuard({ children }: GuestGuardProps) {
|
|
const { loading, authenticated } = useAuthContext();
|
|
|
|
const searchParams = useSearchParams();
|
|
const returnTo = searchParams.get('returnTo') || CONFIG.auth.redirectPath;
|
|
|
|
const [isChecking, setIsChecking] = useState(true);
|
|
|
|
const checkPermissions = async (): Promise<void> => {
|
|
if (loading) {
|
|
return;
|
|
}
|
|
|
|
if (authenticated) {
|
|
// Redirect authenticated users to the returnTo path
|
|
// Using `window.location.href` instead of `router.replace` to avoid unnecessary re-rendering
|
|
// that might be caused by the AuthGuard component
|
|
window.location.href = returnTo;
|
|
return;
|
|
}
|
|
|
|
setIsChecking(false);
|
|
};
|
|
|
|
useEffect(() => {
|
|
checkPermissions();
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
}, [authenticated, loading]);
|
|
|
|
if (isChecking) {
|
|
return <SplashScreen />;
|
|
}
|
|
|
|
return <>{children}</>;
|
|
}
|