// app/login/page.tsx 'use client'; import Link from 'next/link'; import React, { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import ComponentsAuthLoginForm from '@/components/auth/components-auth-login-form'; export default function LoginPage() { const router = useRouter(); const [ready, setReady] = useState(false); // gate to avoid UI flash // Use ONE client-exposed API env var everywhere const API = process.env.NEXT_PUBLIC_FASTAPI_URL; useEffect(() => { let cancelled = false; const controller = new AbortController(); (async () => { try { const res = await fetch(`${API}/auth/me`, { credentials: 'include', cache: 'no-store', // don't reuse a cached 401 signal: controller.signal, }); if (!res.ok) { if (!cancelled) setReady(true); return; } const user = await res.json().catch(() => null); if (user?.id) { // already logged in -> go straight to dashboard router.replace('/adminDashboard'); return; } // not logged in -> show form if (!cancelled) setReady(true); } catch { // network/error -> show form if (!cancelled) setReady(true); } })(); return () => { cancelled = true; controller.abort(); }; }, [router, API]); if (!ready) return null; // or a spinner/skeleton return (
{/* Background gradient layer */}
background gradient
{/* Background decorative objects */} left decor right decor {/* Centered card wrapper */}

Sign In

Enter your email and password to access your account.

Don’t have an account?{' '} SIGN UP
); }