'use client'; import React from 'react'; import { Trophy, Medal, Search, ArrowLeft } from 'lucide-react'; import Button from '@/components/ui/Button'; import Heading from '@/components/ui/Heading'; import type { DriverLeaderboardItemViewModel } from '@/lib/view-models/DriverLeaderboardItemViewModel'; import DriverRankingsFilter from '@/components/DriverRankingsFilter'; import DriverTopThreePodium from '@/components/DriverTopThreePodium'; import Image from 'next/image'; // ============================================================================ // TYPES // ============================================================================ type SkillLevel = 'pro' | 'advanced' | 'intermediate' | 'beginner'; type SortBy = 'rank' | 'rating' | 'wins' | 'podiums' | 'winRate'; interface DriverRankingsTemplateProps { drivers: DriverLeaderboardItemViewModel[]; searchQuery: string; selectedSkill: 'all' | SkillLevel; sortBy: SortBy; showFilters: boolean; onSearchChange: (query: string) => void; onSkillChange: (skill: 'all' | SkillLevel) => void; onSortChange: (sort: SortBy) => void; onToggleFilters: () => void; onDriverClick: (id: string) => void; onBackToLeaderboards: () => void; } // ============================================================================ // HELPER FUNCTIONS // ============================================================================ const getMedalColor = (position: number) => { switch (position) { case 1: return 'text-yellow-400'; case 2: return 'text-gray-300'; case 3: return 'text-amber-600'; default: return 'text-gray-500'; } }; const getMedalBg = (position: number) => { switch (position) { case 1: return 'bg-gradient-to-br from-yellow-400/20 to-yellow-600/10 border-yellow-400/40'; case 2: return 'bg-gradient-to-br from-gray-300/20 to-gray-400/10 border-gray-300/40'; case 3: return 'bg-gradient-to-br from-amber-600/20 to-amber-700/10 border-amber-600/40'; default: return 'bg-iron-gray/50 border-charcoal-outline'; } }; // ============================================================================ // MAIN TEMPLATE COMPONENT // ============================================================================ export default function DriverRankingsTemplate({ drivers, searchQuery, selectedSkill, sortBy, showFilters, onSearchChange, onSkillChange, onSortChange, onToggleFilters, onDriverClick, onBackToLeaderboards, }: DriverRankingsTemplateProps) { // Filter drivers const filteredDrivers = drivers.filter((driver) => { const matchesSearch = driver.name.toLowerCase().includes(searchQuery.toLowerCase()) || driver.nationality.toLowerCase().includes(searchQuery.toLowerCase()); const matchesSkill = selectedSkill === 'all' || driver.skillLevel === selectedSkill; return matchesSearch && matchesSkill; }); // Sort drivers const sortedDrivers = [...filteredDrivers].sort((a, b) => { const rankA = Number.isFinite(a.rank) && a.rank > 0 ? a.rank : Number.POSITIVE_INFINITY; const rankB = Number.isFinite(b.rank) && b.rank > 0 ? b.rank : Number.POSITIVE_INFINITY; switch (sortBy) { case 'rank': return rankA - rankB || b.rating - a.rating || a.name.localeCompare(b.name); case 'rating': return b.rating - a.rating; case 'wins': return b.wins - a.wins; case 'podiums': return b.podiums - a.podiums; case 'winRate': { const aRate = a.racesCompleted > 0 ? a.wins / a.racesCompleted : 0; const bRate = b.racesCompleted > 0 ? b.wins / b.racesCompleted : 0; return bRate - aRate; } default: return 0; } }); return (
Full rankings of all drivers by performance metrics
No drivers found
Try adjusting your filters or search query