118 lines
3.3 KiB
TypeScript
118 lines
3.3 KiB
TypeScript
/**
|
||
* Register Page – New user registration
|
||
*/
|
||
import { useState, type FormEvent } from 'react';
|
||
import { useAuth } from '../contexts/AuthContext';
|
||
|
||
interface RegisterProps {
|
||
onSwitchToLogin: () => void;
|
||
}
|
||
|
||
export function Register({ onSwitchToLogin }: RegisterProps) {
|
||
const { register, loading, error, clearError } = useAuth();
|
||
const [email, setEmail] = useState('');
|
||
const [name, setName] = useState('');
|
||
const [password, setPassword] = useState('');
|
||
const [confirmPassword, setConfirmPassword] = useState('');
|
||
const [localError, setLocalError] = useState<string | null>(null);
|
||
|
||
const handleSubmit = async (e: FormEvent) => {
|
||
e.preventDefault();
|
||
setLocalError(null);
|
||
|
||
if (password !== confirmPassword) {
|
||
setLocalError('Passwörter stimmen nicht überein');
|
||
return;
|
||
}
|
||
if (password.length < 6) {
|
||
setLocalError('Passwort muss mindestens 6 Zeichen lang sein');
|
||
return;
|
||
}
|
||
|
||
try {
|
||
await register(email, password, name);
|
||
} catch {
|
||
// error is set in context
|
||
}
|
||
};
|
||
|
||
const displayError = localError || error;
|
||
|
||
return (
|
||
<div className="auth-page">
|
||
<div className="auth-card">
|
||
<h1 className="auth-title">Web CAD</h1>
|
||
<p className="auth-subtitle">Registrieren</p>
|
||
|
||
{displayError && (
|
||
<div className="auth-error" onClick={() => { clearError(); setLocalError(null); }}>
|
||
{displayError}
|
||
</div>
|
||
)}
|
||
|
||
<form onSubmit={handleSubmit} className="auth-form">
|
||
<div className="auth-field">
|
||
<label htmlFor="reg-name">Name</label>
|
||
<input
|
||
id="reg-name"
|
||
type="text"
|
||
value={name}
|
||
onChange={e => setName(e.target.value)}
|
||
required
|
||
autoFocus
|
||
placeholder="Ihr Name"
|
||
/>
|
||
</div>
|
||
|
||
<div className="auth-field">
|
||
<label htmlFor="reg-email">E-Mail</label>
|
||
<input
|
||
id="reg-email"
|
||
type="email"
|
||
value={email}
|
||
onChange={e => setEmail(e.target.value)}
|
||
required
|
||
placeholder="name@example.com"
|
||
/>
|
||
</div>
|
||
|
||
<div className="auth-field">
|
||
<label htmlFor="reg-password">Passwort</label>
|
||
<input
|
||
id="reg-password"
|
||
type="password"
|
||
value={password}
|
||
onChange={e => setPassword(e.target.value)}
|
||
required
|
||
placeholder="min. 6 Zeichen"
|
||
/>
|
||
</div>
|
||
|
||
<div className="auth-field">
|
||
<label htmlFor="reg-confirm">Passwort bestätigen</label>
|
||
<input
|
||
id="reg-confirm"
|
||
type="password"
|
||
value={confirmPassword}
|
||
onChange={e => setConfirmPassword(e.target.value)}
|
||
required
|
||
placeholder="••••••••"
|
||
/>
|
||
</div>
|
||
|
||
<button type="submit" className="auth-button" disabled={loading}>
|
||
{loading ? 'Wird registriert…' : 'Registrieren'}
|
||
</button>
|
||
</form>
|
||
|
||
<p className="auth-switch">
|
||
Bereits ein Konto?{' '}
|
||
<button type="button" className="auth-link" onClick={onSwitchToLogin}>
|
||
Anmelden
|
||
</button>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
);
|
||
}
|