import { notFound } from 'next/navigation'; import { PageWrapper } from '@/components/shared/state/PageWrapper'; import { PageDataFetcher } from '@/lib/page/PageDataFetcher'; import { LEAGUE_SERVICE_TOKEN, LEAGUE_MEMBERSHIP_SERVICE_TOKEN } from '@/lib/di/tokens'; import type { LeagueService } from '@/lib/services/leagues/LeagueService'; import type { LeagueMembershipService } from '@/lib/services/leagues/LeagueMembershipService'; import type { LeagueSummaryViewModel } from '@/lib/view-models/LeagueSummaryViewModel'; import type { LeagueMembership } from '@/lib/types/LeagueMembership'; import { SessionGateway } from '@/lib/gateways/SessionGateway'; import { ContainerManager } from '@/lib/di/container'; interface LeagueWithRole { league: LeagueSummaryViewModel; membership: LeagueMembership; } interface ProfileLeaguesData { ownedLeagues: LeagueWithRole[]; memberLeagues: LeagueWithRole[]; } async function fetchProfileLeaguesData(): Promise { try { // Get current driver ID from session const sessionGateway = new SessionGateway(); const session = await sessionGateway.getSession(); if (!session?.user?.primaryDriverId) { return null; } const currentDriverId = session.user.primaryDriverId; // Fetch leagues using PageDataFetcher const leagues = await PageDataFetcher.fetch( LEAGUE_SERVICE_TOKEN, 'getAllLeagues' ); if (!leagues) { return null; } // Get membership service from container const container = ContainerManager.getInstance().getContainer(); const membershipService = container.get(LEAGUE_MEMBERSHIP_SERVICE_TOKEN); // Fetch memberships for each league const memberships = await Promise.all( leagues.map(async (league) => { await membershipService.fetchLeagueMemberships(league.id); const membership = membershipService.getMembership(league.id, currentDriverId); return membership ? { league, membership } : null; }) ); // Filter and categorize leagues const owned: LeagueWithRole[] = []; const member: LeagueWithRole[] = []; for (const entry of memberships) { if (!entry || !entry.membership || entry.membership.status !== 'active') { continue; } if (entry.membership.role === 'owner') { owned.push(entry); } else { member.push(entry); } } return { ownedLeagues: owned, memberLeagues: member }; } catch (error) { console.error('Failed to fetch profile leagues data:', error); return null; } } // Template component function ProfileLeaguesTemplate({ data }: { data: ProfileLeaguesData }) { return (

Manage leagues

View leagues you own and participate in, and jump into league admin tools.

{/* Leagues You Own */}

Leagues you own

{data.ownedLeagues.length > 0 && ( {data.ownedLeagues.length} {data.ownedLeagues.length === 1 ? 'league' : 'leagues'} )}
{data.ownedLeagues.length === 0 ? (

You don't own any leagues yet in this session.

) : (
{data.ownedLeagues.map(({ league }) => (

{league.name}

{league.description}

))}
)}
{/* Leagues You're In */}

Leagues you're in

{data.memberLeagues.length > 0 && ( {data.memberLeagues.length} {data.memberLeagues.length === 1 ? 'league' : 'leagues'} )}
{data.memberLeagues.length === 0 ? (

You're not a member of any other leagues yet.

) : (
{data.memberLeagues.map(({ league, membership }) => (

{league.name}

{league.description}

Your role:{' '} {membership.role.charAt(0).toUpperCase() + membership.role.slice(1)}

View league
))}
)}
); } export default async function ProfileLeaguesPage() { const data = await fetchProfileLeaguesData(); if (!data) { notFound(); } return ( ); }