"use client"; import { type MouseEvent } from "react"; import { PolarAngleAxis, PolarGrid, Radar, RadarChart as RechartsRadar, } from "recharts"; import { ChartConfig, ChartContainer, ChartTooltip, } from "@/components/ui/chart/Chart"; import { AlertPill } from "./shared/alert-pill"; import { RadarDataPoint } from "./types"; interface RadarChartProps { data: RadarDataPoint[]; height?: number; dataKey?: string; onSelectPoint?: (point: RadarDataPoint | null) => void; selectedPoint?: RadarDataPoint | null; } const chartConfig = { value: { label: "Findings", color: "var(--chart-radar-primary)", }, } satisfies ChartConfig; interface TooltipPayloadItem { payload: RadarDataPoint; } interface TooltipProps { active?: boolean; payload?: TooltipPayloadItem[]; } const CustomTooltip = ({ active, payload }: TooltipProps) => { if (active && payload && payload.length) { const data = payload[0]; return (

{data.payload.category}

{data.payload.change !== undefined && (

0 ? "var(--bg-pass-primary)" : "var(--bg-data-critical)", fontWeight: "bold", }} > {(data.payload.change as number) > 0 ? "+" : ""} {data.payload.change}%{" "} since last scan

)}
); } return null; }; interface DotShapeProps { cx: number; cy: number; payload: RadarDataPoint & { name?: string }; key: string; } interface CustomDotProps extends DotShapeProps { selectedPoint?: RadarDataPoint | null; onSelectPoint?: (point: RadarDataPoint | null) => void; data?: RadarDataPoint[]; } const CustomDot = ({ cx, cy, payload, selectedPoint, onSelectPoint, data, }: CustomDotProps) => { const currentCategory = payload.name || payload.category; const isSelected = selectedPoint?.category === currentCategory; const handleClick = (e: MouseEvent) => { e.stopPropagation(); if (onSelectPoint) { // Re-evaluate selection status at click time, not from closure const currentlySelected = selectedPoint?.category === currentCategory; if (currentlySelected) { onSelectPoint(null); } else { const fullDataItem = data?.find( (d: RadarDataPoint) => d.category === currentCategory, ); const point: RadarDataPoint = { category: currentCategory, value: payload.value, change: payload.change, severityData: fullDataItem?.severityData || payload.severityData, }; onSelectPoint(point); } } }; return ( ); }; export function RadarChart({ data, height = 400, dataKey = "value", onSelectPoint, selectedPoint, }: RadarChartProps) { return ( } /> { const { key, cx, cy, payload } = dotProps; return ( ); } : { r: 6, fill: "var(--bg-radar-map)", fillOpacity: 1, } } /> ); }