"use client"; import type { PrivateLocation } from "@openstatus/db/src/schema"; import { monitorRegions } from "@openstatus/db/src/schema/constants"; import { getRegionInfo } from "@openstatus/regions"; import { type ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, } from "@openstatus/ui/components/ui/chart"; import { useIsMobile } from "@openstatus/ui/hooks/use-mobile"; import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; import { getRegionColor } from "@/data/regions"; import { cn } from "@/lib/utils"; import { ChartTooltipNumber } from "./chart-tooltip-number"; function getChartConfig(privateLocations?: PrivateLocation[]) { return [ ...monitorRegions, ...(privateLocations?.map((location) => location.id.toString()) ?? []), ].reduce((config, region) => { const privateLocation = privateLocations?.find( (location) => String(location.id) === String(region), ); const regionInfo = getRegionInfo(region, { location: privateLocation?.name, }); const color = getRegionColor(region); if (regionInfo && color) { config[region] = { label: `${regionInfo.location} (${regionInfo.provider})`, color, }; } return config; }, {} as ChartConfig) satisfies ChartConfig; } export type TrendPoint = { timestamp: number; // unix millis [key: string]: number; // milliseconds }; export function ChartLineRegions({ className, data, regions, privateLocations, }: { className?: string; data: TrendPoint[]; regions: string[] | undefined; privateLocations?: PrivateLocation[]; }) { const isMobile = useIsMobile(); const trendData = data ?? []; const chartConfig = getChartConfig(privateLocations); const chartData = trendData.map((d) => ({ ...d, timestamp: new Date(d.timestamp).toLocaleString("default", { hour: "numeric", minute: "numeric", day: "numeric", month: "short", }), })); return ( ( )} /> } /> {regions?.map((region) => { return ( ); })} `${value}ms`} /> {regions && regions.length <= 6 && !isMobile ? ( } /> ) : null} ); }