Files
lettersoup-online/002_source/cms/src/components/auth/guest-guard.tsx
louiscklaw 6c931c1fe8 build ok,
2025-04-14 09:26:24 +08:00

56 lines
1.2 KiB
TypeScript

'use client';
import * as React from 'react';
import { useRouter } from 'next/navigation';
import Alert from '@mui/material/Alert';
import { paths } from '@/paths';
import { logger } from '@/lib/default-logger';
import { useUser } from '@/hooks/use-user';
export interface GuestGuardProps {
children: React.ReactNode;
}
export function GuestGuard({ children }: GuestGuardProps): React.JSX.Element | null {
const router = useRouter();
const { user, error, isLoading } = useUser();
const [isChecking, setIsChecking] = React.useState<boolean>(true);
const checkPermissions = async (): Promise<void> => {
if (isLoading) {
return;
}
if (error) {
setIsChecking(false);
return;
}
if (user) {
logger.debug('[GuestGuard]: User is logged in, redirecting to dashboard');
router.replace(paths.dashboard.overview);
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 <Alert color="error">{error}</Alert>;
}
return <React.Fragment>{children}</React.Fragment>;
}