import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Plane, Clock, Terminal } from "lucide-react"; import { motion } from "framer-motion"; interface FlightApiResponse { data: Array<{ flight_date: string; flight_status: string; departure: { airport: string; timezone: string; iata: string; terminal: string | null; gate: string | null; delay: number | null; scheduled: string; }; arrival: { airport: string; timezone: string; iata: string; terminal: string | null; gate: string | null; delay: number | null; scheduled: string; }; airline: { name: string; iata: string; }; flight: { number: string; iata: string; duration: number | null; }; }>; } interface FlightTrackerProps { data: FlightApiResponse; } export function FlightTracker({ data }: FlightTrackerProps) { if (!data?.data?.[0]) { return null; } const flight = data.data[0]; const formatTime = (timestamp: string) => { const date = new Date(timestamp); return date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: 'UTC' }) + ' UTC'; }; const formatDate = (timestamp: string) => { return new Date(timestamp).toLocaleDateString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit' }); }; const mapStatus = (status: string): "LANDED" | "DEPARTING ON TIME" | "DELAYED" | "SCHEDULED" => { switch (status.toLowerCase()) { case 'landed': return 'LANDED'; case 'active': return flight.departure.delay ? 'DELAYED' : 'DEPARTING ON TIME'; case 'scheduled': return 'SCHEDULED'; default: return 'SCHEDULED'; } }; const getStatusColor = (status: string) => { switch (status) { case "LANDED": return "bg-green-100 hover:bg-green-200 text-green-800 dark:bg-green-900 dark:hover:bg-green-800 dark:text-green-200"; case "DEPARTING ON TIME": return "bg-green-100 hover:bg-green-200 text-green-800 dark:bg-green-900 dark:hover:bg-green-800 dark:text-green-200"; case "DELAYED": return "bg-red-100 hover:bg-red-200 text-red-800 dark:bg-red-900 dark:hover:bg-red-800 dark:text-red-200"; default: return "bg-neutral-100 hover:bg-neutral-200 text-neutral-800 dark:bg-neutral-900 dark:hover:bg-neutral-800 dark:text-neutral-200"; } }; const getPlanePosition = (status: string) => { switch (status.toLowerCase()) { case 'landed': return 'right-0'; case 'active': return 'left-1/2 -translate-x-1/2'; default: return 'left-0'; } }; const calculateDuration = (departureTime: string, arrivalTime: string): string => { const departure = new Date(departureTime); const arrival = new Date(arrivalTime); const durationInMinutes = Math.floor((arrival.getTime() - departure.getTime()) / (1000 * 60)); if (durationInMinutes < 0) return 'N/A'; const hours = Math.floor(durationInMinutes / 60); const minutes = durationInMinutes % 60; if (hours === 0) return `${minutes}m`; return `${hours}h ${minutes}m`; }; const flightInfo = { flightNumber: flight.flight.iata, status: mapStatus(flight.flight_status), departure: { airport: flight.departure.airport, code: flight.departure.iata, time: formatTime(flight.departure.scheduled), date: formatDate(flight.departure.scheduled), terminal: flight.departure.terminal || undefined, gate: flight.departure.gate || undefined }, arrival: { airport: flight.arrival.airport, code: flight.arrival.iata, time: formatTime(flight.arrival.scheduled), date: formatDate(flight.arrival.scheduled), terminal: flight.arrival.terminal || undefined, gate: flight.arrival.gate || undefined }, duration: calculateDuration(flight.departure.scheduled, flight.arrival.scheduled), lastUpdated: new Date().toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: true }) }; return ( {/* Header */}

{flightInfo.flightNumber}

{flight.airline.name}

{flightInfo.status}
{/* Flight Route */}
{/* Departure */}
{flightInfo.departure.code}

{flightInfo.departure.airport}

{flightInfo.departure.time}

{flightInfo.departure.date}

{/* Flight Path - Hidden on mobile */}
{/* Mobile Flight Progress */}
{/* Background Track */}
{/* Progress Bar */}
{/* Animated Plane */}
{/* Arrival */}
{flightInfo.arrival.code}

{flightInfo.arrival.airport}

{flightInfo.arrival.time}

{flightInfo.arrival.date}

{/* Flight Details */}
{/* Departure Details */}
{flightInfo.departure.terminal && (
Terminal {flightInfo.departure.terminal}
)} {flightInfo.departure.gate && (
G
Gate {flightInfo.departure.gate}
)}
{/* Arrival Details */}
{flightInfo.arrival.terminal && (
Terminal {flightInfo.arrival.terminal}
)} {flightInfo.arrival.gate && (
G
Gate {flightInfo.arrival.gate}
)}
{/* Footer */}
Flight duration: {flightInfo.duration}
Last updated: {flightInfo.lastUpdated}
); }