'use client' import { useEffect, useState } from 'react' import { MapContainer, TileLayer, Marker, Popup, useMapEvents } from 'react-leaflet' import L from 'leaflet' import 'leaflet/dist/leaflet.css' // Fix for default marker icons in Next.js if (typeof window !== 'undefined') { delete (L.Icon.Default.prototype as any)._getIconUrl L.Icon.Default.mergeOptions({ iconRetinaUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png', iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png', shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png', }) } interface OutbreakReport { id: string lat: number lng: number crop: string disease: string severity: 'low' | 'medium' | 'high' date: string description: string } interface LeafletMapProps { reports?: OutbreakReport[] onMapClick?: (lat: number, lng: number) => void } // Component to handle map clicks function MapClickHandler({ onClick }: { onClick: (lat: number, lng: number) => void }) { useMapEvents({ click: (e) => { if (onClick) { onClick(e.latlng.lat, e.latlng.lng) } }, }) return null } export default function LeafletMap({ reports = [], onMapClick }: LeafletMapProps) { useEffect(() => { // Ensure we're in the browser if (typeof window === 'undefined') return }, []) const getSeverityColor = (severity: string) => { switch (severity) { case 'high': return '#ef4444' case 'medium': return '#f97316' case 'low': return '#eab308' default: return '#64748b' } } const createMarkerIcon = (severity: string) => { const color = getSeverityColor(severity) return L.divIcon({ className: 'custom-marker', html: `
`, iconSize: [20, 20], iconAnchor: [10, 10], }) } return ( {})} /> {/* Markers for existing reports */} {reports.map((report) => (

{report.crop} - {report.disease}

{report.severity.toUpperCase()}

{report.description && (

{report.description}

)}

{new Date(report.date).toLocaleString()}

))}
) }