'use client'; import React, { useEffect, useState, use } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { Club, ClubMetrics, ClubUpcomingRide, ClubMember, ClubActivityItem, ClubRole, UserPortalPermissions, } from '../../../../components/founder-portal/types'; import { fetchClubData, getPortalPermissions, sanitizePortalError, } from '../../../../lib/club-data'; import { FounderPortalShell } from '../../../../components/founder-portal/founder-portal-shell'; import { FounderOverview } from '../../../../components/founder-portal/founder-overview'; import { OverviewSkeleton } from '../../../../components/founder-portal/skeleton-state'; import { SafeErrorState } from '../../../../components/founder-portal/safe-error-state'; import { firebaseAuth } from '../../../../lib/firebase-client'; interface PageProps { params: Promise<{ clubId: string }>; } export default function ClubFounderPortalPage({ params }: PageProps) { const { clubId } = use(params); const router = useRouter(); const searchParams = useSearchParams(); const [club, setClub] = useState(null); const [metrics, setMetrics] = useState(null); const [upcomingRides, setUpcomingRides] = useState([]); const [pendingApplications, setPendingApplications] = useState([]); const [activities, setActivities] = useState([]); const [userRole, setUserRole] = useState('owner'); const [userRank, setUserRank] = useState('President'); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [activeNav, setActiveNav] = useState('overview'); async function loadData() { setLoading(true); setError(null); try { await firebaseAuth.authStateReady(); const currentUser = firebaseAuth.currentUser; const isDemoPreview = searchParams?.get('preview') === 'demo'; const data = await fetchClubData(clubId, currentUser?.uid, { allowDemoPreview: isDemoPreview, }); setClub(data.club); setMetrics(data.metrics); setUpcomingRides(data.upcomingRides); setPendingApplications(data.pendingApplications); setActivities(data.activities); setUserRole(data.userRole); setUserRank(data.userRank); } catch (err) { setError(sanitizePortalError(err, "Club information couldn't be loaded.")); } finally { setLoading(false); } } useEffect(() => { void loadData(); }, [clubId]); const permissions: UserPortalPermissions = getPortalPermissions(userRole, true); if (loading) { return (
); } // Unauthenticated Guard const isDemo = searchParams?.get('preview') === 'demo'; if (!firebaseAuth.currentUser && !isDemo) { return (
router.push(`/login?returnUrl=/clubs/${clubId}/manage`)} />
); } if (error || !club || !metrics) { return (
router.push('/clubs')} onRetry={loadData} />
); } // Member Access Guard: Non-admin members are forbidden from administrative portal const isDev = process.env.NODE_ENV === 'development'; if (!isDev && userRole !== 'owner' && userRole !== 'admin') { return (
router.push('/clubs')} />
); } return ( setActiveNav(nav)} onSwitchRole={(newRole: ClubRole) => setUserRole(newRole)} pendingApplicationsCount={pendingApplications.length} upcomingRidesCount={upcomingRides.length} > ); }