import { useState, useEffect } from 'react' import { fetchSetupStatus, login, register } from '../api/me.js' import { useSession } from '../context/SessionContext.jsx' export function AuthPanel() { const { applyLogin } = useSession() const [setup, setSetup] = useState(null) const [setupLoading, setSetupLoading] = useState(true) const [setupError, setSetupError] = useState(null) const [authMode, setAuthMode] = useState('login') const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [displayName, setDisplayName] = useState('') const [organizationName, setOrganizationName] = useState('') const [passwordConfirm, setPasswordConfirm] = useState('') const [authError, setAuthError] = useState(null) const [authBusy, setAuthBusy] = useState(false) useEffect(() => { fetchSetupStatus() .then((body) => { setSetup(body) if (body.registration_open) setAuthMode('register') }) .catch((err) => setSetupError(err.message)) .finally(() => setSetupLoading(false)) }, []) async function handleLogin(e) { e.preventDefault() setAuthBusy(true) setAuthError(null) try { const body = await login(email, password) applyLogin(body) } catch (err) { setAuthError(err.message) } finally { setAuthBusy(false) } } async function handleRegister(e) { e.preventDefault() if (password !== passwordConfirm) { setAuthError('Passwörter stimmen nicht überein') return } setAuthBusy(true) setAuthError(null) try { const body = await register({ email, password, display_name: displayName, organization_name: organizationName || undefined, }) applyLogin(body) } catch (err) { setAuthError(err.message) } finally { setAuthBusy(false) } } const registrationOpen = setup?.registration_open === true return (

Kairo

Jinkendo Program Director — Vorhaben & Maßnahmen

{registrationOpen ? 'Ersteinrichtung' : 'Anmelden'}

{setupLoading &&

Prüfe Ersteinrichtung …

} {setupError &&

{setupError}

} {!setupLoading && !setupError && ( <>
{authMode === 'login' && (
)} {authMode === 'register' && registrationOpen && (
)} )} {authError &&

{authError}

}
) }