"use client"; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, ReferenceLine, } from "recharts"; interface ResponseTimeDistributionProps { data: number[]; average: number; targetResponseTime?: number; } const CustomTooltip = ({ active, payload, label }: any) => { if (active && payload && payload.length) { return (

{label}

{payload[0].value} {" "} responses

); } return null; }; export default function ResponseTimeDistribution({ data, average, targetResponseTime, }: ResponseTimeDistributionProps) { if (!data || !data.length) { return (
No response time data available
); } // Create bins for the histogram (0-1s, 1-2s, 2-3s, etc.) const maxTime = Math.ceil(Math.max(...data)); const bins = Array(Math.min(maxTime + 1, 10)).fill(0); // Count responses in each bin data.forEach((time) => { const binIndex = Math.min(Math.floor(time), bins.length - 1); bins[binIndex]++; }); // Create chart data const chartData = bins.map((count, i) => { let label; if (i === bins.length - 1 && bins.length < maxTime + 1) { label = `${i}+ sec`; } else { label = `${i}-${i + 1} sec`; } // Determine color based on response time let color; if (i <= 2) color = "hsl(var(--chart-1))"; // Green for fast else if (i <= 5) color = "hsl(var(--chart-4))"; // Yellow for medium else color = "hsl(var(--chart-3))"; // Red for slow return { name: label, value: count, color, }; }); return (
} /> {chartData.map((entry, index) => ( ))} {/* Average line */} {/* Target line (if provided) */} {targetResponseTime && ( )}
); }