"use client"; import * as React from "react"; import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, } from "@/components/ui/chart"; import useSWR from "swr"; import { ServerMonitorChart } from "../../types/nezha-api"; import { formatTime, nezhaFetcher } from "@/lib/utils"; import { formatRelativeTime } from "@/lib/utils"; import { BackIcon } from "@/components/Icon"; import { useRouter } from "next/navigation"; import { useLocale } from "next-intl"; import { useTranslations } from "next-intl"; import NetworkChartLoading from "./NetworkChartLoading"; export function NetworkChartClient({ server_id }: { server_id: number }) { const t = useTranslations("NetworkChartClient"); const { data, error } = useSWR( `/api/monitor?server_id=${server_id}`, nezhaFetcher, ); if (error) return (

{error.message}

); if (!data) return ; const initChartConfig = { avg_delay: { label: t("avg_delay"), }, } satisfies ChartConfig; const chartDataKey = Object.keys(data); const generateChartConfig = chartDataKey.reduce((config, key, index) => { return { ...config, [key]: { label: key, color: `hsl(var(--chart-${index + 1}))`, }, }; }, {} as ChartConfig); const chartConfig = { ...initChartConfig, ...generateChartConfig }; return ( ); } export function NetworkChart({ chartDataKey, chartConfig, chartData, }: { chartDataKey: string[]; chartConfig: ChartConfig; chartData: ServerMonitorChart; }) { const t = useTranslations("NetworkChart"); const router = useRouter(); const locale = useLocale(); const [activeChart, setActiveChart] = React.useState< keyof typeof chartConfig >(chartDataKey[0]); return (
{ router.push(`/${locale}/`); }} className="flex cursor-pointer items-center gap-0.5 text-xl" > {chartData[chartDataKey[0]][0].server_name} {chartDataKey.length} {t("ServerMonitorCount")}
{chartDataKey.map((key, index) => { const chart = key as keyof typeof chartConfig; return ( ); })}
formatRelativeTime(value)} /> `${value}ms`} /> { return formatTime(payload[0].payload.created_at); }} /> } />
); }