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 const creationStatusLabel = (s) => ({ pending: 'ausstehend', approved: 'freigegeben', rejected: 'abgelehnt', withdrawn: 'zurückgezogen', superseded: 'Verein entfernt', })[s] || s /** Freigabe noch gültig (Verein existiert). */ function isActiveApprovedCreation(req) { return req.status === 'approved' && req.created_club_id } /** * 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 [myCreationRequests, setMyCreationRequests] = useState([]) const [createName, setCreateName] = useState('') const [createAbbr, setCreateAbbr] = useState('') const [createDesc, setCreateDesc] = useState('') const [createMessage, setCreateMessage] = useState('') const [createBusy, setCreateBusy] = 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(() => {}) } const refreshCreationRequests = () => { if (!emailOk) return api.getMyClubCreationRequests().then(setMyCreationRequests).catch(() => {}) } useEffect(() => { api.listPublicClubsDirectory().then(setPublicClubs).catch(() => {}) refreshJoinRequests() refreshCreationRequests() }, [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 hasPendingCreation = myCreationRequests.some((r) => r.status === 'pending') const handleCreateClub = async (e) => { e.preventDefault() setError('') setOk('') const name = (createName || '').trim() if (!name) { setError('Bitte einen Vereinsnamen angeben.') return } setCreateBusy(true) try { await api.createClubCreationRequest({ proposed_name: name, proposed_abbreviation: (createAbbr || '').trim() || undefined, proposed_description: (createDesc || '').trim() || undefined, message: (createMessage || '').trim() || undefined, }) setCreateName('') setCreateAbbr('') setCreateDesc('') setCreateMessage('') refreshCreationRequests() setOk( 'Gründungsantrag gesendet. Nach Freigabe durch den Plattform-Administrator wird dein Verein angelegt.' ) } catch (err) { setError(err.message || 'Antrag fehlgeschlagen.') } finally { setCreateBusy(false) } } 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 (

Willkommen bei Shinkan

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.

{!emailOk ? (

Bitte bestätige zuerst deine E-Mail-Adresse. Danach kannst du einen Beitrittsantrag stellen.

) : ( <> {ok ? (

{ok}

) : null} {error ? (

{error}

) : null}

Bestehendem Verein beitreten

Wähle einen Verein und sende einen Beitrittsantrag. Nach Freigabe durch den Vereinsadmin stehen dir alle Funktionen zur Verfügung.

{myJoinRequests.length > 0 ? (
Meine Anträge
    {myJoinRequests.map((r) => (
  • {r.club_name || `Verein #${r.club_id}`} — {joinStatusLabel(r.status)} {r.status === 'pending' ? ( <> {' '} ) : null}
  • ))}
) : null}