"use client"; import { Rectangle, ResponsiveContainer, Sankey, Tooltip } from "recharts"; import { CHART_COLORS, SEVERITY_COLORS } from "./shared/constants"; interface SankeyNode { name: string; } interface SankeyLink { source: number; target: number; value: number; } interface SankeyChartProps { data: { nodes: SankeyNode[]; links: SankeyLink[]; }; height?: number; } const COLORS: Record = { Success: "var(--color-success)", Fail: "var(--color-destructive)", AWS: "var(--color-orange)", Azure: "var(--color-cyan)", Google: "var(--color-red)", ...SEVERITY_COLORS, }; const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const data = payload[0].payload; return (

{data.name}

{data.value && (

Value: {data.value}

)}
); } return null; }; const CustomNode = ({ x, y, width, height, payload, containerWidth }: any) => { const isOut = x + width + 6 > containerWidth; const nodeName = payload.name; const color = COLORS[nodeName] || CHART_COLORS.defaultColor; return ( {nodeName} {payload.value} ); }; const CustomLink = (props: any) => { const { sourceX, targetX, sourceY, targetY, sourceControlX, targetControlX, linkWidth, } = props; const sourceName = props.payload.source?.name || ""; const color = COLORS[sourceName] || CHART_COLORS.defaultColor; return ( ); }; export function SankeyChart({ data, height = 400 }: SankeyChartProps) { return ( } link={} nodePadding={50} margin={{ top: 20, right: 160, bottom: 20, left: 160 }} > } /> ); }