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
});
}
});