"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 isFaded = selectedPoint !== null && !isSelected;
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,
categoryId: fullDataItem?.categoryId || payload.categoryId || "",
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,
}
}
/>
);
}