'use client'; import { getAirports } from '@/api/airport'; import { Airport } from '@/api/airport.types'; import { getMetars } from '@/api/metar'; import { DivIcon, LatLngBounds } from 'leaflet'; import { useEffect, useState } from 'react'; import ReactDOMServer from 'react-dom/server'; import { Marker, TileLayer, Tooltip, useMap, useMapEvents } from 'react-leaflet'; import MetarDialog from './MetarDialog'; import { BsCircle, BsCircleFill } from 'react-icons/bs'; export default function MapTiles() { const [isOpen, setIsOpen] = useState(false); const [airports, setAirports] = useState([]); const [selectedAirport, setSelectedAirport] = useState(); const [zoomLevel, setZoomLevel] = useState(8); // const [dragging, setDragging] = useState(false); const map = useMap(); const mapEvents = useMapEvents({ zoomend: async () => { setZoomLevel(mapEvents.getZoom()); await updateAirports(mapEvents.getBounds()); }, movestart: () => { // setDragging(true); }, moveend: async () => { // setDragging(false); await updateAirports(mapEvents.getBounds()); } }); function handleOpen(airport: Airport) { setSelectedAirport(airport); setIsOpen(true); } async function updateAirports(bounds: LatLngBounds) { const ne = bounds.getNorthEast(); const sw = bounds.getSouthWest(); const { data: _airports } = await getAirports({ bounds: { northEast: { lat: ne.lat, lon: ne.lng }, southWest: { lat: sw.lat, lon: sw.lng } }, limit: 100, page: 1 }); const { data: metars } = await getMetars(_airports); metars.forEach((metar) => { _airports.forEach((airport) => { if (metar.station_id == airport.icao) { airport.metar = metar; } }); }); setAirports(_airports); } function iconSize() { console.log('zoom', zoomLevel); 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 metarIcon(airport: Airport) { if (airport.metar?.flight_category == 'VFR') { return new DivIcon({ html: ReactDOMServer.renderToString(
V
), className: 'metar-marker-icon' }); } else if (airport.metar?.flight_category == 'MVFR') { return new DivIcon({ html: ReactDOMServer.renderToString(
M
), className: 'metar-marker-icon' }); } else if (airport.metar?.flight_category == 'IFR') { return new DivIcon({ html: ReactDOMServer.renderToString(
I
), className: 'metar-marker-icon' }); } else if (airport.metar?.flight_category == 'LIFR') { return new DivIcon({ html: ReactDOMServer.renderToString(
L
), className: 'metar-marker-icon' }); } else { return new DivIcon({ html: ReactDOMServer.renderToString(), className: 'metar-marker-icon' }); } } useEffect(() => { updateAirports(map.getBounds()); }, []); return ( <> {selectedAirport && setIsOpen(false)} airport={selectedAirport} />} {airports.map((airport) => ( handleOpen(airport) }} > {!isOpen && ( {airport.icao} - {airport.full_name} )} ))} ); }