HydroSense / components /MiniMap.tsx
dpv007's picture
Clean sample deploy
53c9876
'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='&copy; <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>
);
}