"use client"; import { type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, } from "@openstatus/ui/components/ui/chart"; import { useQuery } from "@tanstack/react-query"; import { Area, AreaChart, CartesianGrid, Label, ReferenceLine, XAxis, YAxis, } from "recharts"; import { type INTERVALS, type PERCENTILES, type PERIODS, mapTimingPhases, } from "@/data/metrics.client"; import { useTRPC } from "@/lib/trpc/client"; import { ChartTooltipNumber, ChartTooltipNumberRaw, } from "./chart-tooltip-number"; const chartConfig = { dns: { label: "DNS", color: "var(--chart-1)", }, connect: { label: "Connect", color: "var(--chart-2)", }, tls: { label: "TLS", color: "var(--chart-3)", }, ttfb: { label: "TTFB", color: "var(--chart-4)", }, transfer: { label: "Transfer", color: "var(--chart-5)", }, } satisfies ChartConfig; // TODO: create new pipes for timing phase metrics export function ChartAreaTimingPhases({ monitorId, degradedAfter, period, percentile, interval, type, regions, }: { monitorId: string; degradedAfter: number | null; period: (typeof PERIODS)[number]; percentile: (typeof PERCENTILES)[number]; interval: (typeof INTERVALS)[number]; regions: string[] | undefined; type: "http"; }) { const trpc = useTRPC(); const { data: timingPhases } = useQuery( trpc.tinybird.metricsTimingPhases.queryOptions({ monitorId, period, type, interval, regions, }), ); const refinedTimingPhases = timingPhases ? mapTimingPhases(timingPhases, percentile) : []; return ( value.slice(0, 3)} /> { if (index !== 4) { return ( ); } const total = item.payload?.dns + item.payload?.connect + item.payload?.tls + item.payload?.ttfb + item.payload?.transfer; return ( <> ); }} /> } /> {degradedAfter ? ( ) : null} `${value}ms`} /> } /> ); }