/* eslint-disable @typescript-eslint/no-explicit-any */
'use client';
import { MapContainer, TileLayer, Marker, useMapEvents } from 'react-leaflet';
import { useEffect, useState } from 'react';
import 'leaflet/dist/leaflet.css';
import L, { LeafletMouseEvent } from 'leaflet';
type Props = {
defaultCenter: { lat: number; lng: number };
onSelect?: (pos: { lat: number; lng: number }) => void;
readOnly?: boolean;
};
export default function LeafletMap({ defaultCenter, onSelect, readOnly = false }: Props) {
const [markerPos, setMarkerPos] = useState(defaultCenter);
useEffect(() => {
// Aman di sini, karena ini hanya jalan di client
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',
});
}, []);
function LocationMarker() {
useMapEvents({
click(e: LeafletMouseEvent) {
if (readOnly) return;
const { lat, lng } = e.latlng;
setMarkerPos({ lat, lng });
onSelect?.({ lat, lng });
},
});
return ;
}
return (
);
}