Spaces:
Sleeping
Sleeping
| 'use client'; | |
| import { MapContainer, TileLayer, Marker, Popup } from 'react-leaflet'; | |
| import L from 'leaflet'; | |
| import { useEffect, useState } from 'react'; | |
| // Fix for default marker icon 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.7.1/images/marker-icon-2x.png', | |
| iconUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png', | |
| shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png', | |
| }); | |
| } | |
| interface MiniMapProps { | |
| latitude: number; | |
| longitude: number; | |
| locationName: string; | |
| } | |
| export default function MiniMap({ latitude, longitude, locationName }: MiniMapProps) { | |
| const [isClient, setIsClient] = useState(false); | |
| useEffect(() => { | |
| setIsClient(true); | |
| }, []); | |
| if (!isClient) { | |
| return ( | |
| <div className="w-full h-full flex items-center justify-center bg-gray-100"> | |
| <div className="text-sm text-gray-500">Loading map...</div> | |
| </div> | |
| ); | |
| } | |
| return ( | |
| <MapContainer | |
| center={[latitude, longitude]} | |
| zoom={13} | |
| style={{ height: '100%', width: '100%' }} | |
| scrollWheelZoom={false} | |
| dragging={false} | |
| zoomControl={false} | |
| doubleClickZoom={false} | |
| touchZoom={false} | |
| > | |
| <TileLayer | |
| attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>' | |
| url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" | |
| /> | |
| <Marker position={[latitude, longitude]}> | |
| <Popup>{locationName}</Popup> | |
| </Marker> | |
| </MapContainer> | |
| ); | |
| } | |