"use client" import { useEffect } from "react" import { MapContainer, TileLayer, Polyline, CircleMarker, Popup, useMap } from "react-leaflet" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { LatLngBounds, LatLng } from "leaflet" import "leaflet/dist/leaflet.css" type Detection = { id: number type: string class: string confidence: number latitude: number longitude: number frame_number: number } type MapModalProps = { open: boolean onClose: () => void detections: Detection[] detectionType: "pothole-detection" | "sign-board-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 MapModal({ open, onClose, detections, detectionType }: MapModalProps) { // Filter detections with valid GPS coordinates const validDetections = detections.filter(d => d.latitude && d.longitude) if (validDetections.length === 0) { return ( Detection Map
No GPS coordinates available for detections
) } // Extract route coordinates (start to end) const routeCoordinates: [number, number][] = validDetections.map(d => [d.latitude, d.longitude]) // Calculate bounds to fit all markers const bounds = new LatLngBounds( new LatLng(routeCoordinates[0][0], routeCoordinates[0][1]), new LatLng(routeCoordinates[0][0], routeCoordinates[0][1]) ) routeCoordinates.forEach(coord => bounds.extend(new LatLng(coord[0], coord[1]))) // Center point (middle of route) const center: [number, number] = [ (bounds.getNorth() + bounds.getSouth()) / 2, (bounds.getEast() + bounds.getWest()) / 2 ] const isPothole = detectionType === "pothole-detection" return ( {isPothole ? "Pothole" : "Signboard"} Detection Map

{validDetections.length} detection{validDetections.length !== 1 ? "s" : ""} with GPS coordinates

{/* Route line */} {/* Detection markers */} {validDetections.map((detection, idx) => (
{isPothole ? "Pothole" : detection.class.replace(/_/g, " ")} #{detection.id}
Frame: {detection.frame_number}
Confidence: {(detection.confidence * 100).toFixed(1)}%
{detection.latitude.toFixed(6)}, {detection.longitude.toFixed(6)}
))} {/* Auto-fit bounds */}
) }