import React, { useState, useRef, useEffect } from "react"; import { toast } from "react-toastify"; import { API_URL } from "@/config"; function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return decodeURIComponent(parts.pop().split(';').shift()); return null; } function clearCookie(name) { document.cookie = `${name}=; Max-Age=0; path=/;`; } 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 || !password) { setLoading(false); if (!toast.isActive("login-missing-data-toast")) { toast.error("Username and password are required", { toastId: "login-missing-data-toast", }); } return; } const formData = new URLSearchParams({ username, password, grant_type: "password", scope: "", client_id: "", 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", { toastId: "login-error-invalid-toast", }); setLoading(false); return; } if (!resp.ok) { const data = await resp.json().catch(() => ({})); 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) { toast.success("Login successful!", { toastId: "login-success-toast", }); const returnTo = getCookie("returnTo") || "/TRip"; clearCookie("returnTo"); window.location.href = returnTo; } else { toast.error("Login failed: no access token received", { toastId: "login-error-no-token-toast", }); setLoading(false); } } catch (error) { toast.error("Network error during login", { toastId: "login-error-network-toast", }); console.error("Login error:", error); setLoading(false); } } return (
Log In