'use client'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import Heading from '@/components/ui/Heading'; import Image from 'next/image'; import Link from 'next/link'; import type { ProfileViewData } from '@/lib/view-data/ProfileViewData'; import { Activity, Award, BarChart3, Calendar, ChevronRight, Clock, Edit3, ExternalLink, Flag, Globe, History, MessageCircle, Percent, Settings, Shield, Star, Target, TrendingUp, Trophy, Twitch, Twitter, User, UserPlus, Users, Youtube, Zap, Medal, Crown, } from 'lucide-react'; import { useEffect, useState } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import ProfileSettings from '@/components/drivers/ProfileSettings'; import ProfileRaceHistory from '@/components/drivers/ProfileRaceHistory'; import CreateDriverForm from '@/components/drivers/CreateDriverForm'; type ProfileTab = 'overview' | 'history' | 'stats'; interface ProfileTemplateProps { viewData: ProfileViewData | null; mode: 'profile-exists' | 'needs-profile'; onSaveSettings: (updates: { bio?: string; country?: string }) => Promise; } function getAchievementIcon(icon: NonNullable['achievements'][number]['icon']) { switch (icon) { case 'trophy': return Trophy; case 'medal': return Medal; case 'star': return Star; case 'crown': return Crown; case 'target': return Target; case 'zap': return Zap; } } function getSocialIcon(platformLabel: string) { switch (platformLabel) { case 'twitter': return Twitter; case 'youtube': return Youtube; case 'twitch': return Twitch; case 'discord': return MessageCircle; default: return Globe; } } export function ProfileTemplate({ viewData, mode, onSaveSettings }: ProfileTemplateProps) { const router = useRouter(); const searchParams = useSearchParams(); const tabParam = searchParams.get('tab') as ProfileTab | null; const [editMode, setEditMode] = useState(false); const [activeTab, setActiveTab] = useState(tabParam || 'overview'); const [friendRequestSent, setFriendRequestSent] = useState(false); useEffect(() => { if (searchParams.get('tab') !== activeTab) { const params = new URLSearchParams(searchParams.toString()); if (activeTab === 'overview') { params.delete('tab'); } else { params.set('tab', activeTab); } const query = params.toString(); router.replace(`/profile${query ? `?${query}` : ''}`, { scroll: false }); } }, [activeTab, searchParams, router]); useEffect(() => { const tab = searchParams.get('tab') as ProfileTab | null; if (tab && tab !== activeTab) { setActiveTab(tab); } }, [searchParams]); if (mode === 'needs-profile') { return (
Create Your Driver Profile

Join the GridPilot community and start your racing journey

Get Started

Create your driver profile to join leagues, compete in races, and connect with other drivers.

); } if (!viewData) { return (

Unable to load profile

); } if (editMode) { return (
Edit Profile
{/* ProfileSettings expects a DriverProfileDriverSummaryViewModel; keep existing component usage by passing a minimal compatible shape */} { await onSaveSettings(updates); setEditMode(false); }} />
); } return (
{/* Hero */}
{viewData.driver.name}

{viewData.driver.name}

{viewData.driver.countryFlag} {viewData.teamMemberships[0] && ( [{viewData.teamMemberships[0].teamTag || 'TEAM'}] )}
{viewData.stats && (
{viewData.stats.ratingLabel} Rating
{viewData.stats.globalRankLabel} Global
)}
iRacing: {viewData.driver.iracingId ?? '—'} Joined {viewData.driver.joinedAtLabel} {viewData.extendedProfile && ( {viewData.extendedProfile.timezone} )}
{viewData.extendedProfile && viewData.extendedProfile.socialHandles.length > 0 && (
Connect: {viewData.extendedProfile.socialHandles.map((social) => { const Icon = getSocialIcon(social.platformLabel); return ( {social.handle} ); })}
)}
{viewData.driver.bio && (

About

{viewData.driver.bio}

)} {viewData.teamMemberships.length > 0 && (

Team Memberships ({viewData.teamMemberships.length})

{viewData.teamMemberships.map((membership) => (

{membership.teamName}

{membership.roleLabel} Since {membership.joinedAtLabel}
))}
)} {/* Tabs */}
{activeTab === 'history' && (

Race History

)} {activeTab === 'stats' && viewData.stats && (

Performance Overview

{viewData.stats.totalRacesLabel}
Races
{viewData.stats.winsLabel}
Wins
{viewData.stats.podiumsLabel}
Podiums
{viewData.stats.consistencyLabel}
Consistency
)} {activeTab === 'overview' && viewData.extendedProfile && (

Achievements {viewData.extendedProfile.achievements.length} earned

{viewData.extendedProfile.achievements.map((achievement) => { const Icon = getAchievementIcon(achievement.icon); return (

{achievement.title}

{achievement.description}

{achievement.earnedAtLabel}

); })}
)}
); }