import React, { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import api from '../utils/api' function LoginPage() { const [mode, setMode] = useState('login') // 'login' or 'register' const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [name, setName] = useState('') const [error, setError] = useState('') const [loading, setLoading] = useState(false) const [success, setSuccess] = useState('') const [publicClubs, setPublicClubs] = useState([]) const [requestedClubId, setRequestedClubId] = useState('') const [resending, setResending] = useState(false) const navigate = useNavigate() const { checkAuth } = useAuth() useEffect(() => { if (mode !== 'register') return api.listPublicClubsDirectory().then(setPublicClubs).catch(() => setPublicClubs([])) }, [mode]) const handleSubmit = async (e) => { e.preventDefault() setError('') setSuccess('') setLoading(true) try { if (mode === 'login') { const response = await api.login(email, password) localStorage.setItem('authToken', response.token) await checkAuth() navigate('/') } else { const extra = requestedClubId !== '' ? { requested_club_id: parseInt(requestedClubId, 10) } : {} await api.register(email, password, name, extra) setSuccess('Registrierung erfolgreich! Bitte prüfe deine E-Mails (auch Spam).') setMode('login') setPassword('') setRequestedClubId('') } } catch (err) { setError(err.message || 'Ein Fehler ist aufgetreten') } finally { setLoading(false) } } const handleResendVerification = async () => { if (!email.trim()) { setError('Zuerst die E-Mail-Adresse eintragen.') return } setError('') setResending(true) try { await api.resendVerification(email.trim().toLowerCase()) setSuccess( 'Wenn diese Adresse für einen noch unbestätigten Account existiert, erhältst du gleich eine E-Mail.' ) } catch (err) { setError(err.message || 'Versand fehlgeschlagen') } finally { setResending(false) } } return (

🥋 Shinkan Jinkendo

Trainer- und Vereinsplattform

{mode === 'register' && ( <>
setName(e.target.value)} required={mode === 'register'} placeholder="Dein Name" />

Nach der E-Mail-Bestätigung kann der Vereinsadmin deinen Beitritt freigeben.

)}
setEmail(e.target.value)} required placeholder="name@beispiel.de" />
setPassword(e.target.value)} required placeholder="••••••••" minLength="8" />
{error && (
{error}
)} {success && (
{success}
)}
{mode === 'login' && (

Nutzt die E-Mail-Adresse vom Formular — für noch nicht verifizierte Konten (Rate Limit 3 h).

)}
) } export default LoginPage