Files
breakpilot-lehrer/studio-v2/components/CityMapLeaflet.tsx
Benjamin Boenisch 5a31f52310 Initial commit: breakpilot-lehrer - Lehrer KI Platform
Services: Admin-Lehrer, Backend-Lehrer, Studio v2, Website,
Klausur-Service, School-Service, Voice-Service, Geo-Service,
BreakPilot Drive, Agent-Core

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:26 +01:00

78 lines
2.1 KiB
TypeScript

'use client'
import { useEffect } from 'react'
import { MapContainer, TileLayer, Marker, useMapEvents, useMap } from 'react-leaflet'
import L from 'leaflet'
import 'leaflet/dist/leaflet.css'
// Fix für Leaflet Marker Icons in Next.js
const DefaultIcon = L.icon({
iconUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon.png',
iconRetinaUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-icon-2x.png',
shadowUrl: 'https://unpkg.com/leaflet@1.9.4/dist/images/marker-shadow.png',
iconSize: [25, 41],
iconAnchor: [12, 41],
popupAnchor: [1, -34],
shadowSize: [41, 41]
})
L.Marker.prototype.options.icon = DefaultIcon
interface CityMapLeafletProps {
center: { lat: number; lng: number }
zoom: number
markerPosition: [number, number] | null
onMapClick: (lat: number, lng: number) => void
isDark: boolean
}
// Komponente für Klick-Events
function MapClickHandler({ onMapClick }: { onMapClick: (lat: number, lng: number) => void }) {
useMapEvents({
click: (e) => {
onMapClick(e.latlng.lat, e.latlng.lng)
},
})
return null
}
// Komponente um Karte neu zu zentrieren
function MapCenterUpdater({ center, zoom }: { center: { lat: number; lng: number }; zoom: number }) {
const map = useMap()
useEffect(() => {
map.setView([center.lat, center.lng], zoom)
}, [map, center.lat, center.lng, zoom])
return null
}
export default function CityMapLeaflet({
center,
zoom,
markerPosition,
onMapClick,
isDark
}: CityMapLeafletProps) {
return (
<MapContainer
center={[center.lat, center.lng]}
zoom={zoom}
style={{ height: '100%', width: '100%' }}
>
<TileLayer
attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
url={isDark
? 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png'
: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
}
/>
{markerPosition && (
<Marker position={markerPosition} icon={DefaultIcon} />
)}
<MapClickHandler onMapClick={onMapClick} />
<MapCenterUpdater center={center} zoom={zoom} />
</MapContainer>
)
}