46 lines
1.8 KiB
React
46 lines
1.8 KiB
React
import React, { useState } from 'react';
|
|
import { useNavigate, Link } from 'react-router-dom';
|
|
import { useAuth } from '../contexts/AuthContext';
|
|
|
|
const Login = () => {
|
|
const [email, setEmail] = useState('');
|
|
const [password, setPassword] = useState('');
|
|
const [error, setError] = useState('');
|
|
const { login } = useAuth();
|
|
const navigate = useNavigate();
|
|
|
|
const handleSubmit = async (e) => {
|
|
e.preventDefault();
|
|
setError('');
|
|
try {
|
|
await login(email, password);
|
|
navigate('/dashboard');
|
|
} catch (err) {
|
|
setError(err.response?.data?.error || 'Login fehlgeschlagen');
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div style={{ maxWidth: 400, margin: '100px auto', padding: 20, background: 'white', borderRadius: 8, boxShadow: '0 2px 8px rgba(0,0,0,0.15)' }}>
|
|
<h2>Web-CAD Anmeldung</h2>
|
|
{error && <p style={{ color: 'red' }}>{error}</p>}
|
|
<form onSubmit={handleSubmit}>
|
|
<div style={{ marginBottom: 12 }}>
|
|
<label>E-Mail</label><br />
|
|
<input type="email" value={email} onChange={(e) => setEmail(e.target.value)} required style={{ width: '100%', padding: 8, borderRadius: 4, border: '1px solid #ccc' }} />
|
|
</div>
|
|
<div style={{ marginBottom: 16 }}>
|
|
<label>Passwort</label><br />
|
|
<input type="password" value={password} onChange={(e) => setPassword(e.target.value)} required style={{ width: '100%', padding: 8, borderRadius: 4, border: '1px solid #ccc' }} />
|
|
</div>
|
|
<button type="submit" style={{ width: '100%', padding: 10, backgroundColor: '#1890ff', color: 'white', border: 'none', borderRadius: 4, cursor: 'pointer' }}>Anmelden</button>
|
|
</form>
|
|
<p style={{ marginTop: 12, textAlign: 'center' }}>
|
|
Kein Konto? <Link to="/register">Registrieren</Link>
|
|
</p>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Login;
|