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

65 lines
1.6 KiB
TypeScript

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<void> => {
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 <SplashScreen />;
}
return <>{children}</>;
}