import React, { useState, useRef, useEffect } from "react"; import { toast } from "react-toastify"; import { API_URL } from "@/config"; export default function LoginPage() { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [loading, setLoading] = useState(false); const passwordRef = useRef(); useEffect(() => { if (passwordRef.current && password === "") { passwordRef.current.value = ""; } }, []); async function handleSubmit(e) { e.preventDefault(); setLoading(true); try { if (!username) { setLoading(false); if (!toast.isActive("login-username-required-toast")) { return toast.error("Username and password are required", { toastId: "login-missing-data-toast", }); } } if (!password) { setLoading(false); if (!toast.isActive("login-password-required-toast")) { return toast.error("Username and password are required", { toastId: "login-missing-data-toast", }); } } 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", body: formData.toString(), }); if (resp.status === 401) { if (!toast.isActive("login-error-invalid-toast")) { toast.error("Invalid username or password", { toastId: "login-error-invalid-toast", }); } setLoading(false); return; } if (!resp.ok) { const data = await resp.json().catch(() => ({})); if (!toast.isActive("login-error-failed-toast")) { toast.error(data.detail ? `Login failed: ${data.detail}` : "Login failed", { toastId: "login-error-failed-toast", }); } setLoading(false); return; } const data = await resp.json(); if (data.access_token) { if (!toast.isActive("login-success-toast")) { toast.success("Login successful!", { toastId: "login-success-toast", }); } window.location.href = "/TRip"; // TODO: fix, hardcoded } else { if (!toast.isActive("login-error-no-token-toast")) { toast.error("Login failed: no access token received", { toastId: "login-error-no-token-toast", }); setLoading(false); } } } catch (error) { if (!toast.isActive("login-error-network-toast")) { toast.error("Network error during login", { toastId: "login-error-network-toast", }); } console.error("Login error:", error); setLoading(false); } } return (