fix(ui): показывать временные отметки трафика серверов

This commit is contained in:
Denozordec committed 2026-09-28 11:27:20 +07:00
1 parent 65241c94e9
commit c6d146d38f
7 files changed
+56 -27

No files matched your search

+10 -16
View File
@@ -24,20 +24,16 @@ export function useTrafficLive(opts: {
backendUrl: string
serverId: string
iface: string
}): { sample: TrafficLiveSample | null; error: string | null } {
const [sample, setSample] = useState<TrafficLiveSample | null>(null)
const [error, setError] = useState<string | null>(null)
}): { sample: TrafficLiveSample | null; error: string | null; receivedAt: number | null } {
const key = JSON.stringify([opts.enabled, opts.backendUrl, opts.serverId, opts.iface])
const [result, setResult] = useState<{ key: string; sample: TrafficLiveSample | null; receivedAt: number | null; error: string | null } | null>(null)
useEffect(() => {
if (!opts.enabled || !opts.serverId) {
setSample(null)
setError(null)
return
}
if (!opts.enabled || !opts.serverId) return
const ac = new AbortController()
setSample(null)
setError(null)
const setError = (error: string) => {
if (!ac.signal.aborted) setResult(previous => ({ key, sample: previous?.key === key ? previous.sample : null, receivedAt: previous?.key === key ? previous.receivedAt : null, error }))
}
const ifaceQ =
opts.iface && opts.iface !== "__all__"
? `?iface=${encodeURIComponent(opts.iface)}`
@@ -46,7 +42,6 @@ export function useTrafficLive(opts: {
const url = resolveApiUrl(opts.backendUrl, path)
let buf = ""
setError(null)
void (async () => {
try {
@@ -80,8 +75,7 @@ export function useTrafficLive(opts: {
if (!parsed || !Number.isFinite(parsed.rxMbps) || !Number.isFinite(parsed.txMbps) || parsed.rxMbps < 0 || parsed.txMbps < 0 || typeof parsed.at !== "string" || !Number.isFinite(Date.parse(parsed.at))) {
throw new Error("Некорректные данные live-потока")
}
setSample(parsed)
setError(null)
setResult({ key, sample: parsed, receivedAt: Date.now(), error: null })
} else if (ev.event === "error" && ev.data) {
const parsed = JSON.parse(ev.data) as { error?: string }
setError(parsed.error ?? "live error")
@@ -95,7 +89,7 @@ export function useTrafficLive(opts: {
})()
return () => ac.abort()
}, [opts.enabled, opts.backendUrl, opts.serverId, opts.iface])
}, [opts.enabled, opts.backendUrl, opts.serverId, opts.iface, key])
return { sample, error }
return result?.key === key ? { sample: result.sample, error: result.error, receivedAt: result.receivedAt } : { sample: null, error: null, receivedAt: null }
}