'use client'; import Breadcrumbs from '@/components/layout/Breadcrumbs'; import SponsorInsightsCard, { MetricBuilders, SlotTemplates, useSponsorMode } from '@/components/sponsors/SponsorInsightsCard'; import Button from '@/components/ui/Button'; import Card from '@/components/ui/Card'; import Image from 'next/image'; import { useMemo } from 'react'; import JoinTeamButton from '@/components/teams/JoinTeamButton'; import TeamAdmin from '@/components/teams/TeamAdmin'; import TeamRoster from '@/components/teams/TeamRoster'; import TeamStandings from '@/components/teams/TeamStandings'; import StatItem from '@/components/teams/StatItem'; import type { TeamDetailsViewModel } from '@/lib/view-models/TeamDetailsViewModel'; import type { TeamMemberViewModel } from '@/lib/view-models/TeamMemberViewModel'; import { getMediaUrl } from '@/lib/utilities/media'; import PlaceholderImage from '@/components/ui/PlaceholderImage'; type Tab = 'overview' | 'roster' | 'standings' | 'admin'; // ============================================================================ // TEMPLATE PROPS // ============================================================================ export interface TeamDetailTemplateProps { // Data props team: TeamDetailsViewModel | null; memberships: TeamMemberViewModel[]; activeTab: Tab; loading: boolean; isAdmin: boolean; // Event handlers onTabChange: (tab: Tab) => void; onUpdate: () => void; onRemoveMember: (driverId: string) => void; onChangeRole: (driverId: string, newRole: 'owner' | 'admin' | 'member') => void; onGoBack: () => void; } // ============================================================================ // MAIN TEMPLATE COMPONENT // ============================================================================ export default function TeamDetailTemplate({ team, memberships, activeTab, loading, isAdmin, onTabChange, onUpdate, onRemoveMember, onChangeRole, onGoBack, }: TeamDetailTemplateProps) { const isSponsorMode = useSponsorMode(); // Show loading state if (loading) { return (
Loading team...
); } // Show not found state if (!team) { return (

Team Not Found

The team you're looking for doesn't exist or has been disbanded.

); } const tabs: { id: Tab; label: string; visible: boolean }[] = [ { id: 'overview', label: 'Overview', visible: true }, { id: 'roster', label: 'Roster', visible: true }, { id: 'standings', label: 'Standings', visible: true }, { id: 'admin', label: 'Admin', visible: isAdmin }, ]; const visibleTabs = tabs.filter(tab => tab.visible); // Build sponsor insights for team using real membership and league data const leagueCount = team.leagues?.length ?? 0; const teamMetrics = [ MetricBuilders.members(memberships.length), MetricBuilders.reach(memberships.length * 15), MetricBuilders.races(leagueCount), MetricBuilders.engagement(82), ]; return (
{/* Breadcrumb */} {/* Sponsor Insights Card - Consistent placement at top */} {isSponsorMode && team && ( )}
{team.name}

{team.name}

{team.tag && ( [{team.tag}] )}

{team.description}

{memberships.length} {memberships.length === 1 ? 'member' : 'members'} {team.category && ( {team.category} )} {team.createdAt && ( Founded {new Date(team.createdAt).toLocaleDateString('en-US', { month: 'short', year: 'numeric' })} )} {leagueCount > 0 && ( Active in {leagueCount} {leagueCount === 1 ? 'league' : 'leagues'} )}
{visibleTabs.map((tab) => ( ))}
{activeTab === 'overview' && (

About

{team.description}

Quick Stats

{team.category && ( )} {leagueCount > 0 && ( )} {team.createdAt && ( )}

Recent Activity

No recent activity to display
)} {activeTab === 'roster' && ( )} {activeTab === 'standings' && ( )} {activeTab === 'admin' && isAdmin && ( )}
); }