'use client'; import { useEffect } from 'react'; import { MapContainer, TileLayer, CircleMarker, Popup, useMap, } from 'react-leaflet'; import { LatLngBounds, LatLng } from 'leaflet'; import 'leaflet/dist/leaflet.css'; import { Detection } from '@/types'; import { DETECTION_TYPES } from '@/constants/detectionModeConfig'; interface DashboardMapContentProps { detections: Detection[]; } // Component to auto-fit map bounds to show all markers function FitBounds({ bounds }: { bounds: LatLngBounds }) { const map = useMap(); useEffect(() => { if (bounds.isValid()) { map.fitBounds(bounds, { padding: [50, 50] }); } }, [bounds, map]); return null; } export default function DashboardMapContent({ detections, }: DashboardMapContentProps) { if (detections.length === 0) { return (

No detections to display

); } // Calculate bounds to fit all markers const firstDetection = detections[0]; const bounds = new LatLngBounds( new LatLng(firstDetection.latitude!, firstDetection.longitude!), new LatLng(firstDetection.latitude!, firstDetection.longitude!), ); detections.forEach((d) => { if (d.latitude && d.longitude) { bounds.extend(new LatLng(d.latitude, d.longitude)); } }); // Center point const center: [number, number] = [ (bounds.getNorth() + bounds.getSouth()) / 2, (bounds.getEast() + bounds.getWest()) / 2, ]; // Get marker color based on detection type const getMarkerColor = (typeId: string) => { const config = DETECTION_TYPES[typeId.toLowerCase()]; if (config) { return { fill: config.color, stroke: '#ffffff', // White stroke for better visibility on the map }; } return { fill: '#64748b', stroke: '#475569' }; // Default Slate }; // Get display name for detection type const getTypeName = (typeId: string) => { const config = DETECTION_TYPES[typeId.toLowerCase()]; return config ? config.label : typeId.replace(/_/g, ' '); }; return ( {/* Detection markers */} {detections.map((detection, idx) => { const colors = getMarkerColor(detection.type); const typeName = getTypeName(detection.type); return (
{typeName}
Class {detection.class.replace(/_/g, ' ')}
Confidence {(detection.confidence * 100).toFixed(1)}%
Location Details
Latitude {detection.latitude!.toFixed(6)}
Longitude {detection.longitude!.toFixed(6)}
); })} {/* Auto-fit bounds */}
); }