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); 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", body: formData.toString(), }); if (resp.status === 401) { toast.error("Invalid username or password"); setLoading(false); return; } if (!resp.ok) { const data = await resp.json().catch(() => ({})); toast.error(data.detail ? `Login failed: ${data.detail}` : "Login failed"); setLoading(false); return; } const data = await resp.json(); if (data.access_token) { toast.success("Login successful!"); window.location.href = "/TRip"; // TODO: fix, hardcoded } 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 (

Logo Authentication Required

{/* Username */}
setUsername(e.target.value)} required disabled={loading} className="peer block w-full px-4 pt-5 pb-2 border border-gray-300 dark:border-gray-700 rounded-lg bg-transparent text-gray-900 dark:text-white placeholder-transparent focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Password */}
setPassword(e.target.value)} required disabled={loading} className="peer block w-full px-4 pt-5 pb-2 border border-gray-300 dark:border-gray-700 rounded-lg bg-transparent text-gray-900 dark:text-white placeholder-transparent focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
); }