import { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import api from '../utils/api' import { useAuth } from '../context/AuthContext' import EmailVerificationBanner from '../components/EmailVerificationBanner' import { resolveAccountState } from '../utils/accountState' const joinStatusLabel = (s) => ({ pending: 'ausstehend', accepted: 'angenommen', rejected: 'abgelehnt', withdrawn: 'zurückgezogen', })[s] || s /** * Onboarding für Nutzer ohne aktive Vereinsmitgliedschaft (Phase A). */ export default function OnboardingPage() { const { user, checkAuth } = useAuth() const [publicClubs, setPublicClubs] = useState([]) const [myJoinRequests, setMyJoinRequests] = useState([]) const [joinClubId, setJoinClubId] = useState('') const [joinMessage, setJoinMessage] = useState('') const [joinBusy, setJoinBusy] = useState(false) const [error, setError] = useState('') const [ok, setOk] = useState('') const accountState = resolveAccountState(user) const emailOk = accountState !== 'unverified' const refreshJoinRequests = () => { if (!emailOk) return api.getMyClubJoinRequests().then(setMyJoinRequests).catch(() => {}) } useEffect(() => { api.listPublicClubsDirectory().then(setPublicClubs).catch(() => {}) refreshJoinRequests() }, [user?.id, emailOk]) const memberClubIds = new Set((user?.clubs || []).map((c) => c.id)) const pendingClubIds = new Set( myJoinRequests.filter((r) => r.status === 'pending').map((r) => r.club_id) ) const joinClubChoices = publicClubs.filter( (c) => !memberClubIds.has(c.id) && !pendingClubIds.has(c.id) ) const handleJoin = async (e) => { e.preventDefault() setError('') setOk('') if (!joinClubId) { setError('Bitte einen Verein auswählen.') return } setJoinBusy(true) try { await api.createClubJoinRequest({ club_id: parseInt(joinClubId, 10), message: (joinMessage || '').trim() || undefined, }) setJoinMessage('') setJoinClubId('') refreshJoinRequests() await checkAuth() setOk('Antrag gesendet. Der Vereinsadmin kann ihn unter Vereinsverwaltung annehmen.') } catch (err) { setError(err.message || 'Antrag fehlgeschlagen.') } finally { setJoinBusy(false) } } return (
Shinkan ist die Trainingsplanungs-Plattform für Vereine. Um Übungen, Planung und Medien zu nutzen, brauchst du eine Mitgliedschaft in einem Verein — oder du beantragst die Gründung eines neuen Vereins.
Bitte bestätige zuerst deine E-Mail-Adresse. Danach kannst du einen Beitrittsantrag stellen.
{ok}
) : null} {error ? ({error}
) : null}Wähle einen Verein und sende einen Beitrittsantrag. Nach Freigabe durch den Vereinsadmin stehen dir alle Funktionen zur Verfügung.
{myJoinRequests.length > 0 ? (Die Beantragung einer neuen Vereinsgründung wird als Nächstes freigeschaltet (Freigabe durch den Plattform-Administrator). Bis dahin wende dich an{' '} support@jinkendo.de oder tritt einem bestehenden Verein bei.
Einstellungen (Passwort, Profil)