import React, { useState, 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); 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!"); // Redirect 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

setUsername(e.target.value)} required className="appearance-none block w-full px-4 py-3 border border-gray-300 dark:border-gray-700 rounded-lg shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-[#121212] dark:text-white" placeholder="Your username" disabled={loading} />
setPassword(e.target.value)} required className="appearance-none block w-full px-4 py-3 border border-gray-300 dark:border-gray-700 rounded-lg shadow-sm placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:bg-[#121212] dark:text-white" placeholder="••••••••" disabled={loading} />
); }