From 9be79e97f1d7fa061d7876a226d39acca282a931 Mon Sep 17 00:00:00 2001
From: Flanker <6418075+podcctv@users.noreply.github.com>
Date: Wed, 6 May 2026 03:01:12 +0000
Subject: [PATCH] Fix usage bars updates and refresh card/latency visuals
---
src/components/NodeCard.tsx | 11 ++++++-----
src/components/NodeDetail.tsx | 27 ++++++++++++++++-----------
src/utils/cn.ts | 10 +++++-----
3 files changed, 27 insertions(+), 21 deletions(-)
diff --git a/src/components/NodeCard.tsx b/src/components/NodeCard.tsx
index f5fd5b2..79e7bab 100644
--- a/src/components/NodeCard.tsx
+++ b/src/components/NodeCard.tsx
@@ -75,7 +75,8 @@ function Metric({
sub?: ReactNode
subTitle?: string
}) {
- const percent = pct(value)
+ const numericValue = Number.isFinite(value) ? (value as number) : undefined
+ const percent = pct(numericValue)
return (
@@ -85,12 +86,12 @@ function Metric({
{sub}
) : null}
- {percent}%
+ {percent}
)
diff --git a/src/components/NodeDetail.tsx b/src/components/NodeDetail.tsx
index c262953..67db19d 100644
--- a/src/components/NodeDetail.tsx
+++ b/src/components/NodeDetail.tsx
@@ -280,20 +280,25 @@ function OnlinePanel({ online }: { online: boolean }) {
}
function TcpMiniPanel({ rows }: { rows: TaskQueryResult[] }) {
- const stats = useMemo(() => computeLatencyStats(rows, 'tcp_ping').slice(0, 3), [rows])
+ const stats = useMemo(() => computeLatencyStats(rows, 'tcp_ping').slice(0, 5), [rows])
return (
-
-
二网 TCPing
+
+
TCP Ping 质量
{stats.map(s => (
-
-
{s.name}
-
-
+
+
+
{s.name}
+
+
{s.avg != null ? `${Math.round(s.avg)}ms` : '—'}
+
+
+ min {s.min != null ? `${Math.round(s.min)}ms` : '—'} · max {s.max != null ? `${Math.round(s.max)}ms` : '—'} · 丢包 {s.loss.toFixed(1)}%
-
{s.avg != null ? `${Math.round(s.avg)}ms` : '—'}
))}
{stats.length === 0 &&
暂无 TCP ping 数据
}
diff --git a/src/utils/cn.ts b/src/utils/cn.ts
index 2a592fc..ee69393 100644
--- a/src/utils/cn.ts
+++ b/src/utils/cn.ts
@@ -7,21 +7,21 @@ export function cn(...inputs: ClassValue[]) {
export function loadColor(v?: number | null) {
if (v == null || !Number.isFinite(v)) return 'bg-muted-foreground/40'
- if (v >= 90) return 'bg-gradient-to-r from-fuchsia-500 via-rose-500 to-orange-500'
- if (v >= 70) return 'bg-gradient-to-r from-amber-400 to-orange-500'
- return 'bg-gradient-to-r from-emerald-400 to-cyan-400'
+ if (v >= 90) return 'bg-gradient-to-r from-rose-500 via-orange-500 to-amber-400'
+ if (v >= 70) return 'bg-gradient-to-r from-amber-400 to-yellow-300'
+ return 'bg-gradient-to-r from-sky-500 to-cyan-300'
}
export function loadTextColor(v?: number | null) {
if (v == null || !Number.isFinite(v)) return 'text-muted-foreground'
if (v >= 90) return 'text-rose-300'
if (v >= 70) return 'text-amber-300'
- return 'text-emerald-300'
+ return 'text-cyan-300'
}
export function strokeColor(v?: number | null) {
if (v == null || !Number.isFinite(v)) return 'stroke-muted-foreground/40'
if (v >= 90) return 'stroke-rose-500'
if (v >= 70) return 'stroke-amber-500'
- return 'stroke-emerald-500'
+ return 'stroke-sky-500'
}