85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { notFound } from 'next/navigation';
|
|
import { LeagueDetailPageQuery } from '@/lib/page-queries/LeagueDetailPageQuery';
|
|
import { LeagueDetailTemplate } from '@/templates/LeagueDetailTemplate';
|
|
import { LeagueDetailViewDataBuilder } from '@/lib/builders/view-data/LeagueDetailViewDataBuilder';
|
|
import { Text } from '@/ui/Text';
|
|
|
|
export default async function LeagueLayout({
|
|
children,
|
|
params,
|
|
}: {
|
|
children: React.ReactNode;
|
|
params: Promise<{ id: string }>;
|
|
}) {
|
|
const { id: leagueId } = await params;
|
|
|
|
// Execute PageQuery to get league data
|
|
const result = await LeagueDetailPageQuery.execute(leagueId);
|
|
|
|
if (result.isErr()) {
|
|
const error = result.getError();
|
|
if (error === 'notFound' || error === 'redirect') {
|
|
notFound();
|
|
}
|
|
// Return error state
|
|
return (
|
|
<LeagueDetailTemplate
|
|
viewData={{
|
|
leagueId,
|
|
name: 'Error',
|
|
description: 'Failed to load league',
|
|
info: { name: 'Error', membersCount: 0, racesCount: 0, avgSOF: 0, structure: '', scoring: '', createdAt: '' },
|
|
runningRaces: [],
|
|
sponsors: [],
|
|
ownerSummary: null,
|
|
adminSummaries: [],
|
|
stewardSummaries: [],
|
|
sponsorInsights: null
|
|
}}
|
|
tabs={[]}
|
|
>
|
|
<Text align="center">Failed to load league</Text>
|
|
</LeagueDetailTemplate>
|
|
);
|
|
}
|
|
|
|
const data = result.unwrap();
|
|
|
|
const viewData = LeagueDetailViewDataBuilder.build({
|
|
league: data.league,
|
|
owner: null,
|
|
scoringConfig: null,
|
|
memberships: { members: [] },
|
|
races: [],
|
|
sponsors: [],
|
|
});
|
|
|
|
// Define tab configuration
|
|
const baseTabs = [
|
|
{ label: 'Overview', href: `/leagues/${leagueId}`, exact: true },
|
|
{ label: 'Schedule', href: `/leagues/${leagueId}/schedule`, exact: false },
|
|
{ label: 'Standings', href: `/leagues/${leagueId}/standings`, exact: false },
|
|
{ label: 'Rulebook', href: `/leagues/${leagueId}/rulebook`, exact: false },
|
|
];
|
|
|
|
const adminTabs = [
|
|
{ label: 'Schedule Admin', href: `/leagues/${leagueId}/schedule/admin`, exact: false },
|
|
{ label: 'Sponsorships', href: `/leagues/${leagueId}/sponsorships`, exact: false },
|
|
{ label: 'Stewarding', href: `/leagues/${leagueId}/stewarding`, exact: false },
|
|
{ label: 'Wallet', href: `/leagues/${leagueId}/wallet`, exact: false },
|
|
{ label: 'Settings', href: `/leagues/${leagueId}/settings`, exact: false },
|
|
];
|
|
|
|
// TODO: Admin check needs to be implemented properly
|
|
// For now, show admin tabs if user is logged in
|
|
const tabs = [...baseTabs, ...adminTabs];
|
|
|
|
return (
|
|
<LeagueDetailTemplate
|
|
viewData={viewData}
|
|
tabs={tabs}
|
|
>
|
|
{children}
|
|
</LeagueDetailTemplate>
|
|
);
|
|
} |