'use client'; import { AdvancedMarker } from '@vis.gl/react-google-maps'; import { useCallback, useRef, useState } from 'react'; const OPERATOR_COLORS: Record = { AWS: '#FF9900', Google: '#4285F4', Microsoft: '#00A4EF', Meta: '#0668E1', Oracle: '#F80000', Equinix: '#ED1C24', 'Digital Realty': '#0072CE', CoreWeave: '#7B2FBE', QTS: '#00B388', CyrusOne: '#003B5C', NTT: '#E60012', Vantage: '#0099D8', }; function getOperatorColor(operator: string): string { return OPERATOR_COLORS[operator] ?? '#6B7280'; } function getMarkerSize(capacityMw: number): number { if (capacityMw >= 500) return 32; if (capacityMw >= 200) return 26; if (capacityMw >= 100) return 22; if (capacityMw >= 50) return 18; return 14; } function getPulseDuration(capacityMw: number): number { if (capacityMw >= 500) return 1.2; if (capacityMw >= 200) return 1.8; if (capacityMw >= 100) return 2.4; return 3.0; } export interface DatacenterMarkerData { id: string; name: string; operator: string; capacity_mw: number; status: string; year_opened: number; region_id: string; region_code: string; region_name: string; lat: number; lng: number; } interface DatacenterMarkerProps { datacenter: DatacenterMarkerData; onClick: (datacenter: DatacenterMarkerData) => void; isPulsing?: boolean; isSelected?: boolean; /** Callback to register/unregister the underlying AdvancedMarkerElement for clustering. */ setMarkerRef?: (marker: google.maps.marker.AdvancedMarkerElement | null, id: string) => void; } export function DatacenterMarker({ datacenter, onClick, isPulsing = false, isSelected = false, setMarkerRef, }: DatacenterMarkerProps) { const [hovered, setHovered] = useState(false); const size = getMarkerSize(datacenter.capacity_mw); const color = getOperatorColor(datacenter.operator); const pulseDuration = getPulseDuration(datacenter.capacity_mw); const registeredRef = useRef(false); const handleClick = useCallback(() => { onClick(datacenter); }, [datacenter, onClick]); const refCallback = useCallback( (marker: google.maps.marker.AdvancedMarkerElement | null) => { if (!setMarkerRef) return; if (marker && !registeredRef.current) { registeredRef.current = true; setMarkerRef(marker, datacenter.id); } else if (!marker && registeredRef.current) { registeredRef.current = false; setMarkerRef(null, datacenter.id); } }, [datacenter.id, setMarkerRef], ); return (
setHovered(true)} onMouseLeave={() => setHovered(false)}> {isPulsing && (
)}
{size >= 26 && (
{datacenter.capacity_mw}
)} {hovered && (
{datacenter.name}
{datacenter.operator} · {datacenter.capacity_mw} MW
)}
); }