'use client'; import { useEffect, useMemo, useState } from 'react'; import { MapContainer, TileLayer, Marker, Popup, useMap } from 'react-leaflet'; import { OrderItem, Supplier } from '@/lib/types'; import { formatCurrency, calculateDistance, parseCoordinates } from '@/lib/utils'; import { Navigation, AlertTriangle } from 'lucide-react'; import L from 'leaflet'; import 'leaflet/dist/leaflet.css'; const defaultIcon = L.icon({ iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png', iconRetinaUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon-2x.png', shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }); const currentLocationIcon = L.divIcon({ className: 'custom-div-icon', html: `
`, iconSize: [20, 20], iconAnchor: [10, 10], }); interface MapViewProps { items: OrderItem[]; onNavigate: (lat: number, lng: number, name: string) => void; } function MapBounds({ items }: { items: OrderItem[] }) { const map = useMap(); useEffect(() => { const validPoints = items .map((i) => { const coords = parseCoordinates(i.expand?.supplier?.coordinates); return coords ? [coords.latitude, coords.longitude] as [number, number] : null; }) .filter((point): point is [number, number] => point !== null); if (validPoints.length > 0) { const bounds = L.latLngBounds(validPoints); map.fitBounds(bounds, { padding: [50, 50], maxZoom: 15 }); } }, [map, items]); return null; } export default function CollectionMap({ items, onNavigate }: MapViewProps) { const [userLocation, setUserLocation] = useState<[number, number] | null>(null); useEffect(() => { if ('geolocation' in navigator) { navigator.geolocation.getCurrentPosition( (pos) => setUserLocation([pos.coords.latitude, pos.coords.longitude]), () => {}, { enableHighAccuracy: false, timeout: 30000 } ); } }, []); const suppliers = useMemo(() => { const map = new Map{supplier.supplieraddress}
{distance &&{distance.toFixed(1)} km away
}Legend