Files
HKSingleParty/03_source/frontend/src/auth/guard/guest-guard.tsx
louiscklaw b7cd25b614 build ok,
2025-06-15 11:28:24 +08:00

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}</>;
}