import { useState } from 'react' import { useNavigate, useLocation } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import LetterGlitch from '../components/LetterGlitch' import { safeReturnPath } from '../lib/returnPath' import { NO_STAFF_ACCESS } from '../lib/staffAccess' export default function LoginPage() { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) const [code, setCode] = useState('') const [notice, setNotice] = useState('') const { login, mfaPending, sendCode, verifyCode, cancelMfa } = useAuth() const navigate = useNavigate() const location = useLocation() const target = safeReturnPath(location.state?.from) const handleSubmit = async (e) => { e.preventDefault() setError('') setLoading(true) try { const result = await login(email, password) if (result.success) { navigate(target, { replace: true }) } else if (result.mfaRequired) { if (result.error) setError(result.error) } else { // Bessere Fehlermeldungen let errorMessage = result.error || 'Login fehlgeschlagen' if (errorMessage === NO_STAFF_ACCESS) { // Kunden-Konto: Hinweis unveraendert anzeigen } else if (errorMessage.includes('Invalid credentials') || errorMessage.includes('401')) { errorMessage = 'Ungültige Email oder Passwort. Bitte überprüfe deine Eingaben.' } else if (errorMessage.includes('Email/Password') || errorMessage.includes('auth')) { errorMessage = 'Email/Password Authentifizierung ist möglicherweise nicht aktiviert. Bitte überprüfe deine Appwrite-Konfiguration.' } setError(errorMessage) } } catch (err) { setError('Ein unerwarteter Fehler ist aufgetreten: ' + (err.message || 'Unbekannter Fehler')) } finally { setLoading(false) } } const handleCode = async (e) => { e.preventDefault() setError('') setLoading(true) const result = await verifyCode(code) setLoading(false) if (result.success) { navigate(target, { replace: true }) } else { setError(result.error) setCode('') } } const handleSend = async () => { setError('') setNotice('') setLoading(true) const result = await sendCode() setLoading(false) if (result.success) setNotice('Neuer Code ist unterwegs.') else setError(result.error) } const handleCancel = async () => { await cancelMfa() setError('') setNotice('') setCode('') setPassword('') } const linkButton = { background: 'none', border: 0, padding: 0, color: '#e2e8f0', textDecoration: 'underline', cursor: 'pointer', font: 'inherit', } const codeStep = mfaPending && (
{error && (
{error}
)}

{!mfaPending.challengeId ? 'Wir schicken dir einen Code an deine E-Mail-Adresse.' : `Wir haben dir einen Code an ${mfaPending.email || 'deine E-Mail-Adresse'} geschickt.`}

{notice &&

{notice}

} {mfaPending.challengeId ? ( <>
setCode(e.target.value.replace(/\D/g, ''))} inputMode="numeric" autoComplete="one-time-code" maxLength={6} required autoFocus style={{ letterSpacing: '0.3em' }} />

{' · '}

) : ( <>

)}
) return (
{/* LetterGlitch Hintergrund */}
{/* Login-Formular */}

Webklar WOMS 2.0

{codeStep ||
{error && (
{error}
)}
setEmail(e.target.value)} required placeholder="deine@email.com" />
setPassword(e.target.value)} required placeholder="••••••••" minLength={8} />
}
) }