'use client'; import { getAirports } from '@/js/api/airport'; import { Airport } from '@/js/api/airport.types'; import { getMetars } from '@/js/api/metar'; import { Metar } from '@/js/api/metar.types'; import { faArrowsSpin, faLocationArrow, faLocationPin } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { DivIcon, LatLngBounds } from 'leaflet'; import Link from 'next/link'; import { useEffect, useState } from 'react'; import ReactDOMServer from 'react-dom/server'; import { MapContainer, Marker, Popup, TileLayer, Tooltip, useMap, useMapEvents } from 'react-leaflet'; export default function Map() { return ( ); } function MapTiles() { const [airports, setAirports] = useState([]); const [zoomLevel, setZoomLevel] = useState(8); // const [dragging, setDragging] = useState(false); const map = useMap(); const mapEvents = useMapEvents({ zoomend: () => { setZoomLevel(mapEvents.getZoom()); }, movestart: () => { // setDragging(true); }, moveend: async () => { // setDragging(false); await updateAirports(mapEvents.getBounds()); } }); async function updateAirports(bounds: LatLngBounds) { const ne = bounds.getNorthEast(); const sw = bounds.getSouthWest(); const _airports = await getAirports({ ne_lat: ne.lat, ne_lon: ne.lng, sw_lat: sw.lat, sw_lon: sw.lng, limit: 100, page: 1 }); const metars = await getMetars(_airports); metars.forEach((metar) => { _airports.forEach((airport) => { if (metar.station_id == airport.icao) { airport.metar = metar; } }); }); setAirports(_airports); } function metarBGColor(metar: Metar | undefined) { if (metar?.flight_category == 'VFR') { return 'bg-emerald-600'; } else if (metar?.flight_category == 'MVFR') { return 'bg-blue-600'; } else if (metar?.flight_category == 'IFR') { return 'bg-orange-600'; } else if (metar?.flight_category == 'LIFR') { return 'bg-red-600'; } else { return 'bg-black'; } } function metarTextColor(metar: Metar | undefined) { if (metar?.flight_category == 'VFR') { return 'text-emerald-700'; } else if (metar?.flight_category == 'MVFR') { return 'text-blue-700'; } else if (metar?.flight_category == 'IFR') { return 'text-orange-700'; } else if (metar?.flight_category == 'LIFR') { return 'text-red-700'; } else { return 'text-black/50'; } } function windColor(metar: Metar | undefined) { if (Number(metar?.wind_speed_kt) <= 9) { return 'bg-green-300'; } else if (Number(metar?.wind_speed_kt) > 9) { return 'bg-orange-300'; } else if (Number(metar?.wind_speed_kt) > 12) { return 'bg-red-300'; } } function iconSize() { if (zoomLevel <= 4) { return 'text-xs'; } else if (zoomLevel <= 5) { return 'text-sm'; } else if (zoomLevel <= 6) { return 'text-base'; } else if (zoomLevel <= 7) { return 'text-lg'; } else if (zoomLevel <= 9) { return 'text-2xl'; } else if (zoomLevel <= 11) { return 'text-3xl'; } else if (zoomLevel >= 12) { return 'text-4xl'; } } function icon(airport: Airport) { return new DivIcon({ html: ReactDOMServer.renderToString( ), className: 'metar-marker-icon' }); } useEffect(() => { updateAirports(map.getBounds()); }, []); return ( <> {airports.map((airport) => ( {airport.icao} - {airport.full_name}

{airport.icao} {airport.full_name}


{airport.metar?.raw_text}

{airport.metar?.flight_category ? airport.metar?.flight_category : 'UNKN'}
{airport.metar && airport.metar.wind_dir_degrees && Number(airport.metar.wind_dir_degrees) > 0 ? ( ) : ( <> )} {airport.metar && airport.metar.wind_dir_degrees && airport.metar.wind_dir_degrees == 'VRB' ? ( ) : ( <> )} {airport.metar?.wind_speed_kt != undefined && airport.metar?.wind_speed_kt > 0 ? `${airport.metar?.wind_speed_kt} KT` : 'CALM'}
))} ); }