'use client'; import { useEffect, useState } from 'react'; import { onAuthStateChanged } from 'firebase/auth'; import { useRouter, useSearchParams } from 'next/navigation'; import { firebaseAuth } from '../../lib/firebase-client'; import { fetchFounderClubContext, sanitizePortalError, type FounderClubContext } from '../../lib/club-data'; import { FounderPortalShell } from './founder-portal-shell'; import { FounderApplications } from './founder-applications'; import { FounderWall } from './founder-wall'; import { FounderMembers } from './founder-members'; import { OverviewSkeleton } from './skeleton-state'; import { SafeErrorState } from './safe-error-state'; type ReviewArea = 'applications' | 'wall' | 'members'; export function FounderModerationPage({ clubId }: { clubId: string }) { const router = useRouter(); const searchParams = useSearchParams(); const demo = process.env.NODE_ENV === 'development' && searchParams?.get('preview') === 'demo'; const [context, setContext] = useState(null); const [area, setArea] = useState('applications'); const [loading, setLoading] = useState(true); const [access, setAccess] = useState<'sign-in' | 'restricted' | null>(null); const [error, setError] = useState(null); const [retry, setRetry] = useState(0); const [pendingCount, setPendingCount] = useState(0); useEffect(() => { let generation = 0; let disposed = false; const unsubscribe = onAuthStateChanged(firebaseAuth, async (user) => { const current = ++generation; setContext(null); setPendingCount(0); setLoading(true); setAccess(null); setError(null); if (!demo && (!user || user.isAnonymous)) { setAccess('sign-in'); setLoading(false); return; } try { const resolved = await fetchFounderClubContext(clubId, user?.uid, { allowDemoPreview: demo }); if (disposed || current !== generation) return; if (!resolved.permissions.canManageSettings && !resolved.isDemoFixture) setAccess('restricted'); else setContext(resolved); } catch (err) { if (!disposed && current === generation) setError(sanitizePortalError(err, 'Club moderation could not be loaded.')); } finally { if (!disposed && current === generation) setLoading(false); } }); return () => { disposed = true; generation++; unsubscribe(); }; }, [clubId, demo, retry]); if (loading) return
; if (access) return router.push(access === 'sign-in' ? '/login' : '/clubs')} />; if (error || !context) return setRetry((value) => value + 1)} actionLabel="Return to Clubs" onAction={() => router.push('/clubs')} />; return

Club management

Moderation

Review membership requests, Wall posts, and member access.

Post reports are not collected yet. Choose Wall posts to review recent content.

{([ ['applications', 'Applications'], ['wall', 'Wall posts'], ['members', 'Members'], ] as const).map(([id, label]) => )}
{area === 'applications' && } {area === 'wall' && } {area === 'members' && }
; }