import { useEffect, useState, FormEvent } from "react"; import { useSearchParams, Link } from "react-router-dom"; function saveTokensAndRedirect(token: string, refreshToken: string, redirect: string) { localStorage.setItem("token", token); localStorage.setItem("refreshToken", refreshToken); window.location.href = redirect; } export default function LoginPage() { const [searchParams] = useSearchParams(); const redirect = searchParams.get("redirect") ?? "/ragview"; const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); // Handle OAuth2 callback — token & refreshToken in URL useEffect(() => { const token = searchParams.get("token"); const refreshToken = searchParams.get("refreshToken"); if (token && refreshToken) { saveTokensAndRedirect(token, refreshToken, redirect); } }, [searchParams, redirect]); async function handleSubmit(e: FormEvent) { e.preventDefault(); setError(""); setLoading(true); try { const res = await fetch("/api/auth/login", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ email, password }), }); const data = await res.json(); if (data.success && data.payload?.token) { saveTokensAndRedirect(data.payload.token, data.payload.refreshToken ?? "", redirect); } else { setError(data.message ?? "Login failed"); } } catch { setError("Network error. Please try again."); } finally { setLoading(false); } } const registerHref = `/register?redirect=${encodeURIComponent(redirect)}`; return (
{/* Card */}

Welcome back

Sign in to your account

{/* Email/Password form */}
setEmail(e.target.value)} placeholder="you@example.com" className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-4 py-2.5 text-sm placeholder-gray-500 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition" />
setPassword(e.target.value)} placeholder="••••••••" className="w-full bg-gray-800 border border-gray-700 text-white rounded-lg px-4 py-2.5 text-sm placeholder-gray-500 focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition" />
{error && (

{error}

)}
{/* Divider */}
or
{/* OAuth2 buttons */} {/* Register link */}

Don't have an account?{" "} Register

); } function GoogleIcon() { return ( ); } function GitHubIcon() { return ( ); } function FacebookIcon() { return ( ); }