import React, { useState, useEffect } from "react"; import { toast } from "react-toastify"; import { API_URL } from "@/config"; export default function LoginPage() { const [redirectTo, setRedirectTo] = useState("/"); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); // On mount, determine where to redirect after login: // 1. Use sessionStorage 'redirectTo' if present // 2. Else use document.referrer if same-origin // 3. Else fallback to "/" useEffect(() => { try { const savedRedirect = sessionStorage.getItem("redirectTo"); if (savedRedirect) { setRedirectTo(savedRedirect); } else if (document.referrer) { const refUrl = new URL(document.referrer); // Only accept same origin referrers for security if (refUrl.origin === window.location.origin) { const pathAndQuery = refUrl.pathname + refUrl.search; setRedirectTo(pathAndQuery); sessionStorage.setItem("redirectTo", pathAndQuery); } } } catch (error) { // Fail silently; fallback to "/" console.error("Error determining redirect target:", error); setRedirectTo("/"); } }, []); async function handleSubmit(e) { e.preventDefault(); setLoading(true); try { if (!username) { setLoading(false); return toast.error("Username is required"); } if (!password) { setLoading(false); return toast.error("Password is required"); } const formData = new URLSearchParams(); formData.append("username", username); formData.append("password", password); formData.append("grant_type", "password"); formData.append("scope", ""); formData.append("client_id", ""); formData.append("client_secret", ""); const resp = await fetch(`${API_URL}/auth/login`, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", }, credentials: "include", // Important for cookies body: formData.toString(), }); if (resp.status === 401) { toast.error("Invalid username or password"); setLoading(false); return; } if (!resp.ok) { if (resp.json().detail) { toast.error(`Login failed: ${resp.json().detail}`); } else { toast.error("Login failed"); } setLoading(false); return; } const data = await resp.json(); if (data.access_token) { toast.success("Login successful!"); // Clear stored redirect after use sessionStorage.removeItem("redirectTo"); // Redirect to stored path or fallback "/" window.location.href = redirectTo || "/"; } else { toast.error("Login failed: no access token received"); setLoading(false); } } catch (error) { toast.error("Network error during login"); console.error("Login error:", error); setLoading(false); } } return (