This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
breakpilot-pwa/studio-v2/components/CityMapLeaflet.tsx
Benjamin Admin bfdaf63ba9 fix: Restore all files lost during destructive rebase
A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.

This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).

Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 09:51:32 +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>
)
}