import { Cluster, ClusterStats } from '@googlemaps/markerclusterer'; import { getRiskColor, calculateClusterRisk, getTotalEventsInCluster } from './mapUtils'; import { createRoot } from 'react-dom/client'; interface ClusterElementProps { count: number; riskLevel: string; scale: number; } export const ClusterElement = ({ count, riskLevel, scale } : ClusterElementProps) => { const color = getRiskColor(riskLevel); const size = `${30 * scale}px`; return (
{ const target = e.currentTarget; target.style.transform = 'scale(1.1)'; target.style.zIndex = '1000'; target.style.borderColor = 'black'; target.style.borderWidth = '1px'; }} onMouseLeave={(e) => { const target = e.currentTarget; target.style.transform = 'scale(1)'; target.style.zIndex = 'auto'; target.style.borderWidth = '0px'; }} > {count}
); }; export const createClusterRenderer = () => ({ render: ( cluster: Cluster, stats: ClusterStats, map: google.maps.Map ): google.maps.marker.AdvancedMarkerElement => { const totalEvents = getTotalEventsInCluster(cluster); const position = cluster.position; const riskLevel = calculateClusterRisk(cluster, stats, map); const size = totalEvents < 10 ? 'small' : totalEvents < 100 ? 'medium' : 'large'; const scale = size === 'small' ? 1 : size === 'medium' ? 1.2 : 1.4; const element = document.createElement('div'); const root = createRoot(element); root.render( ); return new google.maps.marker.AdvancedMarkerElement({ position, content: element }); } });