diff --git a/src/components/ServiceTracker.tsx b/src/components/ServiceTracker.tsx index 4efbb2f..a49a4d5 100644 --- a/src/components/ServiceTracker.tsx +++ b/src/components/ServiceTracker.tsx @@ -19,10 +19,16 @@ export function ServiceTracker({ serverList }: { serverList: NezhaServer[] }) { }) const processServiceData = (serviceData: ServiceData) => { - const days = serviceData.up.map((up, index) => ({ - completed: up > serviceData.down[index], - date: new Date(Date.now() - (29 - index) * 24 * 60 * 60 * 1000), - })) + const days = serviceData.up.map((up, index) => { + const totalChecks = up + serviceData.down[index] + const dailyUptime = totalChecks > 0 ? (up / totalChecks) * 100 : 0 + return { + completed: up > serviceData.down[index], + date: new Date(Date.now() - (29 - index) * 24 * 60 * 60 * 1000), + uptime: dailyUptime, + delay: serviceData.delay[index] || 0 + } + }) const totalUp = serviceData.up.reduce((a, b) => a + b, 0) const totalChecks = serviceData.up.reduce((a, b) => a + b, 0) + serviceData.down.reduce((a, b) => a + b, 0) diff --git a/src/components/ServiceTrackerClient.tsx b/src/components/ServiceTrackerClient.tsx index dfc5376..47e2fde 100644 --- a/src/components/ServiceTrackerClient.tsx +++ b/src/components/ServiceTrackerClient.tsx @@ -1,13 +1,20 @@ import { cn } from "@/lib/utils" import React from "react" import { useTranslation } from "react-i18next" - +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip" import { Separator } from "./ui/separator" interface ServiceTrackerProps { days: Array<{ completed: boolean date?: Date + uptime: number + delay: number }> className?: string title?: string @@ -18,6 +25,25 @@ interface ServiceTrackerProps { export const ServiceTrackerClient: React.FC = ({ days, className, title, uptime = 100, avgDelay = 0 }) => { const { t } = useTranslation() const customBackgroundImage = (window.CustomBackgroundImage as string) !== "" ? window.CustomBackgroundImage : undefined + + const getUptimeColor = (uptime: number) => { + if (uptime >= 99) return "text-emerald-500" + if (uptime >= 95) return "text-amber-500" + return "text-rose-500" + } + + const getDelayColor = (delay: number) => { + if (delay < 100) return "text-emerald-500" + if (delay < 300) return "text-amber-500" + return "text-rose-500" + } + + const getStatusColor = (uptime: number) => { + if (uptime >= 99) return "bg-emerald-500" + if (uptime >= 95) return "bg-amber-500" + return "bg-rose-500" + } + return (
= ({ days, clas >
-
-
-
+
{title}
-
- {avgDelay.toFixed(0)}ms - - +
+ + {avgDelay.toFixed(0)}ms + + + {uptime.toFixed(1)}% {t("serviceTracker.uptime")}
-
+
{days.map((day, index) => ( -
+ + + +
+ + +
+

{day.date?.toLocaleDateString()}

+
+
+ {t("serviceTracker.uptime")}: + 95 ? "text-green-500" : "text-red-500")}> + {day.uptime.toFixed(1)}% + +
+
+ {t("serviceTracker.delay")}: + + {day.delay.toFixed(0)}ms + +
+
+
+
+ + ))}
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index f88943e..f261519 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -46,6 +46,7 @@ "serviceTracker": { "noService": "No service data", "uptime": "Uptime", + "delay": "Delay", "daysAgo": "days ago", "today": "Today", "loading": "Loading..." diff --git a/src/locales/zh-CN/translation.json b/src/locales/zh-CN/translation.json index 9fd23d9..6047bd1 100644 --- a/src/locales/zh-CN/translation.json +++ b/src/locales/zh-CN/translation.json @@ -44,8 +44,9 @@ "nextUpdate": "下次更新" }, "serviceTracker": { - "noService": "没有服务监测数据", - "uptime": "可用率", + "noService": "无服务数据", + "uptime": "在线率", + "delay": "延迟", "daysAgo": "天前", "today": "今天", "loading": "加载中..." diff --git a/src/locales/zh-TW/translation.json b/src/locales/zh-TW/translation.json index 51f2ddb..c60cfb9 100644 --- a/src/locales/zh-TW/translation.json +++ b/src/locales/zh-TW/translation.json @@ -44,8 +44,9 @@ "nextUpdate": "下次更新" }, "serviceTracker": { - "noService": "沒有服務監控數據", - "uptime": "可用率", + "noService": "無服務數據", + "uptime": "在線率", + "delay": "延遲", "daysAgo": "天前", "today": "今天", "loading": "載入中..."