Spaces:
Sleeping
Sleeping
File size: 2,216 Bytes
8608e55 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
/**
* LoginForm.jsx
*
* This component renders a login form where a user enters their name and email.
* - On submit, it sends the credentials to the backend login API.
* - If successful, it stores the user info and session ID in the parent state.
* - Handles loading state and displays error messages if login fails.
*/
import { useState } from "react";
import "../styles/LoginForm.css";
function LoginForm({ setUser, setSessionId }) {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [loading, setLoading] = useState(false);
const [error, setError] = useState("");
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
setError("");
try {
const response = await fetch("/auth/login", {
method: "POST",
body: new URLSearchParams({ name, email }),
headers: { "Content-Type": "application/x-www-form-urlencoded" },
});
const data = await response.json();
if (response.ok && data.session_id) {
setUser({ name, email });
setSessionId(data.session_id);
} else {
setError(data.message || "Login failed. Please try again.");
}
} catch (err) {
console.error("Login error:", err);
setError("Network error. Please check your connection and try again.");
} finally {
setLoading(false);
}
};
return (
<div className="login-container">
<h2>Login</h2>
<form onSubmit={handleSubmit} className="login-form">
<input
type="text"
placeholder="Enter Name"
value={name}
onChange={(e) => setName(e.target.value)}
required
disabled={loading}
/>
<input
type="email"
placeholder="Enter Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
required
disabled={loading}
/>
{error && <div className="error-message" style={{color: 'red', margin: '10px 0'}}>{error}</div>}
<button type="submit" disabled={loading}>
{loading ? "Logging in..." : "Login"}
</button>
</form>
</div>
);
}
export default LoginForm; |