This commit is contained in:
2026-03-07 11:37:37 -05:00
parent aa5ad8327e
commit 32f63fe43b
32 changed files with 2470 additions and 328 deletions

View File

@@ -0,0 +1,70 @@
import React, { useState } from 'react';
import './Login.css';
export default function Login({ onLoginSuccess }) {
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const [error, setError] = useState('');
const [loading, setLoading] = useState(false);
const handleSubmit = async (e) => {
e.preventDefault();
setLoading(true);
setError('');
try {
const formData = new FormData();
formData.append('username', username);
formData.append('password', password);
const response = await fetch('api/login', {
method: 'POST',
body: formData,
});
if (response.ok) {
const data = await response.json();
localStorage.setItem('access_token', data.access_token);
onLoginSuccess();
} else {
setError('Invalid username or password');
}
} catch (error) {
setError('Login failed. Please try again.');
} finally {
setLoading(false);
}
};
return (
<div className="login-container">
<div className="login-box">
<h2>Login Required</h2>
<form onSubmit={handleSubmit}>
<div className="form-group">
<input
type="text"
placeholder="Username"
value={username}
onChange={(e) => setUsername(e.target.value)}
required
/>
</div>
<div className="form-group">
<input
type="password"
placeholder="Password"
value={password}
onChange={(e) => setPassword(e.target.value)}
required
/>
</div>
{error && <div className="error">{error}</div>}
<button type="submit" disabled={loading}>
{loading ? 'Logging in...' : 'Login'}
</button>
</form>
</div>
</div>
);
}