import { useCallback, useEffect, useState } from 'react' import { Navigate } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import api from '../utils/api' import AdminPageNav from '../components/AdminPageNav' function formatDate(value) { if (!value) return '—' try { return new Date(value).toLocaleString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }) } catch { return String(value) } } /** * Superadmin: offene Anträge auf Vereinsgründung freigeben oder ablehnen. */ export default function AdminClubCreationRequestsPage() { const { user } = useAuth() const isSuperadmin = user?.role === 'superadmin' const [requests, setRequests] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [busyId, setBusyId] = useState(null) const load = useCallback(async () => { const rows = await api.listAdminClubCreationRequests() setRequests(Array.isArray(rows) ? rows : []) }, []) useEffect(() => { if (!isSuperadmin) return let cancelled = false ;(async () => { setError('') setLoading(true) try { await load() } catch (e) { if (!cancelled) setError(e.message || String(e)) } finally { if (!cancelled) setLoading(false) } })() return () => { cancelled = true } }, [isSuperadmin, load]) if (!isSuperadmin) return const handleApprove = async (id) => { if (!confirm('Verein anlegen und Antragsteller als Hauptverwalter eintragen?')) return setBusyId(id) setError('') try { await api.approveClubCreationRequest(id) await load() } catch (e) { setError(e.message || String(e)) } finally { setBusyId(null) } } const handleReject = async (id) => { if (!confirm('Gründungsantrag wirklich ablehnen?')) return setBusyId(id) setError('') try { await api.rejectClubCreationRequest(id) await load() } catch (e) { setError(e.message || String(e)) } finally { setBusyId(null) } } return (

Vereinsgründungen

Offene Anträge von verifizierten Nutzern ohne Vereinsmitgliedschaft. Bei Freigabe wird ein neuer Verein mit Free-Abo angelegt; der Antragsteller wird Vereinsadmin und Trainer.

{error ? (

{error}

) : null} {loading ? (

Laden…

) : requests.length === 0 ? (

Keine offenen Gründungsanträge.

) : (
{requests.map((r) => (
{r.proposed_name} {r.proposed_abbreviation ? ( ({r.proposed_abbreviation}) ) : null}

Antragsteller: {r.applicant_name || '—'}{' '} {r.applicant_email ? `· ${r.applicant_email}` : ''}

Eingereicht: {formatDate(r.created_at)}

{r.proposed_description ? (

{r.proposed_description}

) : null} {r.message ? (

Nachricht: {r.message}

) : null}
))}
)}
) }