'use client'; import { Badge } from '@/ui/Badge'; import { Button } from '@/ui/Button'; import { Icon } from '@/ui/Icon'; import { Link } from '@/ui/Link'; import { Stack } from '@/ui/Stack'; import { Surface } from '@/ui/Surface'; import { Text } from '@/ui/Text'; import { Calendar, Clock, MapPin, type LucideIcon } from 'lucide-react'; import { useEffect, useState } from 'react'; interface NextRaceCountdownWidgetProps { raceId: string; raceName: string; date: string; track?: string; car?: string; isRegistered?: boolean; } interface CountdownState { days: number; hours: number; minutes: number; seconds: number; } export function NextRaceCountdownWidget({ raceId, raceName, date, track, car, isRegistered = false, }: NextRaceCountdownWidgetProps) { const [countdown, setCountdown] = useState(null); const [isExpired, setIsExpired] = useState(false); useEffect(() => { const calculateCountdown = () => { const now = new Date(); const raceDate = new Date(date); const diff = raceDate.getTime() - now.getTime(); if (diff <= 0) { setIsExpired(true); setCountdown({ days: 0, hours: 0, minutes: 0, seconds: 0 }); return; } const days = Math.floor(diff / (1000 * 60 * 60 * 24)); const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); const seconds = Math.floor((diff % (1000 * 60)) / 1000); setCountdown({ days, hours, minutes, seconds }); setIsExpired(false); }; calculateCountdown(); const interval = setInterval(calculateCountdown, 1000); return () => clearInterval(interval); }, [date]); const formatTime = (value: number) => value.toString().padStart(2, '0'); return ( {/* Header */} Next Race {isRegistered && ( Registered )} {/* Race Info */} {raceName} {track && ( {track} )} {car && ( {car} )} {/* Countdown Timer */} {isExpired ? 'Race Started' : 'Starts in'} {countdown && ( {formatTime(countdown.days)} Days : {formatTime(countdown.hours)} Hours : {formatTime(countdown.minutes)} Mins : {formatTime(countdown.seconds)} Secs )} {/* Actions */} ); }