'use client' import { useState, useCallback } from 'react' import Map, { Marker, Popup, Layer, Source } from 'react-map-gl' import 'mapbox-gl/dist/mapbox-gl.css' import type { ComplianceRequirement } from '@/lib/types/infrastructure' import { Card, CardContent } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' interface ComplianceMapViewProps { requirements: ComplianceRequirement[] onCountryClick?: (country: string) => void } const statusColors: Record = { Compliant: '#10b981', Partial: '#f59e0b', Pending: '#3b82f6', 'Non-Compliant': '#ef4444', } // Basic country coordinates (in production, use a proper geocoding service) const countryCoordinates: Record = { Italy: { lat: 41.9028, lng: 12.4964 }, Germany: { lat: 51.1657, lng: 10.4515 }, France: { lat: 46.2276, lng: 2.2137 }, Spain: { lat: 40.4637, lng: -3.7492 }, // Add more as needed } export function ComplianceMapView({ requirements, onCountryClick }: ComplianceMapViewProps) { const [popupInfo, setPopupInfo] = useState(null) const [viewState, setViewState] = useState({ longitude: 12.4964, latitude: 41.9028, zoom: 3, }) const handleMarkerClick = useCallback( (requirement: ComplianceRequirement) => { setPopupInfo(requirement) onCountryClick?.(requirement.country) }, [onCountryClick] ) const mapboxToken = process.env.NEXT_PUBLIC_MAPBOX_TOKEN || '' if (!mapboxToken) { return (

Mapbox token not configured. Please set NEXT_PUBLIC_MAPBOX_TOKEN in your environment variables.

) } return (
setViewState(evt.viewState)} mapboxAccessToken={mapboxToken} style={{ width: '100%', height: '100%' }} mapStyle="mapbox://styles/mapbox/dark-v10" > {requirements.map((req) => { const coords = countryCoordinates[req.country] if (!coords) return null return ( handleMarkerClick(req)} >
) })} {popupInfo && ( setPopupInfo(null)} closeButton closeOnClick={false} >

{popupInfo.country}

{popupInfo.status}
Frameworks: {popupInfo.frameworks.join(', ')}
Requirements: {popupInfo.requirements.length}
)}
) }