"use client" import AnimatedCircularProgressBar from "@/components/ui/animated-circular-progress-bar"; import { Card, CardContent } from "@/components/ui/card"; import useSWR from "swr"; import { NezhaAPISafe } from "../../types/nezha-api"; import { formatNezhaInfo, formatRelativeTime, formatTime, nezhaFetcher } from "@/lib/utils"; import getEnv from "@/lib/env-entry"; import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent } from "@/components/ui/chart"; import { Area, AreaChart, CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts"; import { useEffect, useState } from "react"; type cpuChartData = { timeStamp: string; cpu: number; } type memChartData = { timeStamp: string; mem: number; swap: number; } type networkChartData = { timeStamp: string; upload: number; download: number; } export default function ServerDetailChartClient({ server_id, }: { server_id: number; }) { const { data, error } = useSWR( `/api/detail?server_id=${server_id}`, nezhaFetcher, { refreshInterval: Number(getEnv("NEXT_PUBLIC_NezhaFetchInterval")) || 5000, }, ); if (error) { return ( <>

{error.message}

{/* {t("chart_fetch_error_message")} */} fetch_error_message

); } if (!data) return null; return (
) } function CpuChart({ data }: { data: NezhaAPISafe }) { const [cpuChartData, setCpuChartData] = useState([] as cpuChartData[]); const { cpu } = formatNezhaInfo(data); useEffect(() => { if (data) { const timestamp = Date.now().toString(); const newData = [ ...cpuChartData, { timeStamp: timestamp, cpu: cpu }, ]; if (newData.length > 30) { newData.shift(); } setCpuChartData(newData); } }, [data]); const chartConfig = { cpu: { label: "CPU", }, } satisfies ChartConfig return (

CPU

{cpu.toFixed(0)}%

formatRelativeTime(value)} /> `${value}%`} />
) } function MemChart({ data }: { data: NezhaAPISafe }) { const [memChartData, setMemChartData] = useState([] as memChartData[]); const { mem, swap } = formatNezhaInfo(data); useEffect(() => { if (data) { const timestamp = Date.now().toString(); const newData = [ ...memChartData, { timeStamp: timestamp, mem: mem, swap: swap }, ]; if (newData.length > 30) { newData.shift(); } setMemChartData(newData); } }, [data]); const chartConfig = { mem: { label: "Mem", }, swap: { label: "Swap", }, } satisfies ChartConfig return (

Mem

{mem.toFixed(0)}%

Swap

{swap.toFixed(0)}%

formatRelativeTime(value)} /> `${value}%`} />
) } function NetworkChart({ data }: { data: NezhaAPISafe }) { const [networkChartData, setNetworkChartData] = useState([] as networkChartData[]); const { up, down } = formatNezhaInfo(data); useEffect(() => { if (data) { const timestamp = Date.now().toString(); const newData = [ ...networkChartData, { timeStamp: timestamp, upload: up, download: down }, ]; if (newData.length > 30) { newData.shift(); } setNetworkChartData(newData); } }, [data]); let maxDownload = Math.max(...networkChartData.map((item) => item.download)); maxDownload = Math.ceil(maxDownload); if (maxDownload < 1) { maxDownload = 1; } const chartConfig = { upload: { label: "Upload", }, download: { label: "Download", }, } satisfies ChartConfig return (

Upload

{up.toFixed(2)} M/s

Download

{down.toFixed(2)} M/s

formatRelativeTime(value)} /> `${value.toFixed(0)}M/s`} />
) }