"use client" import {CartesianGrid,Line,LineChart,XAxis,YAxis} from "recharts" import {ChartContainer,ChartTooltip,ChartTooltipContent,type ChartConfig} from "@/components/ui/chart" import {formatRangeAgo} from "@/lib/fmt-rate" const PALETTE=["var(--chart-line-1)","var(--chart-line-2)","var(--chart-line-3)","var(--chart-line-4)","var(--chart-1)","var(--chart-2)","var(--chart-3)","var(--chart-4)"] const LEGACY_LABELS:Record={msk:"MSK",spb:"SPB",fra:"FRA",ams:"AMS"} interface LatencyChartProps {series:Record;labels?:Record} /** Reuse the installed ChartContainer / multi-line composition of ReUI chart-23. */ export function LatencyChart({series,labels:labelsProp}:LatencyChartProps){ const entries=Object.entries(series).filter(([,values])=>values.some(v=>typeof v==="number"&&Number.isFinite(v))) const count=Math.max(1,...entries.map(([,values])=>values.length)) const data=Array.from({length:count},(_,i)=>({time:formatRangeAgo(Math.round((1-i/Math.max(count-1,1))*60)),...Object.fromEntries(entries.map(([key,values])=>[key,typeof values[i]==="number"&&Number.isFinite(values[i])?values[i]:null]))})) const label=(key:string)=>labelsProp?.[key]??LEGACY_LABELS[key]??key.replace(/^src-/,"") const config=Object.fromEntries(entries.map(([key],index)=>[key,{label:label(key),color:PALETTE[index%PALETTE.length]}])) satisfies ChartConfig const dot=(key:string)=>function IsolatedDot({cx,cy,index}:{cx?:number;cy?:number;index?:number}){const values=series[key];if(index==null||cx==null||cy==null||values[index]==null||values[index-1]!=null||values[index+1]!=null)return ;return } if(!entries.length)return

Нет измеренной истории RTT

return
String(v)+" мс"}/>
{config[String(name)]?.label??name}{typeof value==="number"?String(value)+" мс":"—"}
}/>}/> {entries.map(([key])=>)}
{entries.map(([key])=>{label(key)})}
}