import { Box, Drawer, Group, Tabs, TabsList, Text, Tooltip } from '@mantine/core'; import { Airport, AirportCategory } from '@lib/airport.types.ts'; import { getMarkerColor, Metar } from '@lib/metar.types.ts'; import { useEffect, useState } from 'react'; import { getMetars } from '@lib/metar.ts'; import { useMediaQuery } from '@mantine/hooks'; export default function AirportDrawer({ airport, setAirport }: { airport: Airport | null; setAirport: (airport: Airport | null) => void; }) { const [metar, setMetar] = useState(undefined); const isMobile = useMediaQuery('(max-width: 768px)'); useEffect(() => { if (!airport) return; function updateMetar() { if (!airport) return; console.log(airport.icao); getMetars({ icaos: [airport.icao] }).then((m) => { if (m.length > 0) { setMetar(m[0]); } else { setMetar(undefined); } }); } updateMetar(); const interval = setInterval(updateMetar, 60000); return () => clearInterval(interval); }, [airport]); if (!airport) { return null; } const metarColor = getMarkerColor(metar?.flight_category || 'UNKN'); return ( setAirport(null)} title={airport.name} withinPortal zIndex={1000} styles={{ root: { padding: 0, margin: 0, width: 0, height: 0 } }} padding='md' size={isMobile ? '100%' : 'md'} position='left' withOverlay={false} closeOnClickOutside={false} > {metar && metar.flight_category && ( {metar.flight_category} )} Info Weather {airport.latest_metar && ( )} ); } function AirportInfo({ airport }: { airport: Airport }) { return (
ICAO: {airport.icao} Category: {airportCategoryToText(airport.category)}
); } function WeatherInfo({ metar }: { metar: Metar }) { return <>{metar.raw_text} } function airportCategoryToText(category: AirportCategory): string { switch (category) { case AirportCategory.SMALL: return 'Small'; case AirportCategory.MEDIUM: return 'Medium'; case AirportCategory.LARGE: return 'Large'; case AirportCategory.HELIPORT: return 'Helipad'; case AirportCategory.CLOSED: return 'Closed'; case AirportCategory.SEAPLANE: return 'Seaplane Base'; case AirportCategory.BALLOONPORT: return 'Balloon Port'; default: return 'Unknown'; } } function TimeSince({ date }: { date: string }) { const inputDate = new Date(date); // @ts-expect-error doing arithmetic with dates const seconds = Math.floor((new Date() - inputDate) / 1000); if (seconds < 60) { const content = seconds + (seconds === 1 ? " second ago" : " seconds ago"); return {content}; } else { const minutes = Math.floor(seconds / 60); const content = minutes + (minutes === 1 ? " minute ago" : " minutes ago"); // If more than 60 minutes have passed, set the text color to yellow return = 60 ? '#fca903' : undefined }}>{content}; } }