fix(ui): показывать временные отметки трафика серверов
This commit is contained in:
1 parent
65241c94e9
commit
c6d146d38f
7 files changed
+56
-27
No files matched your search
+10
-16
@@ -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 }
|
||||
}
|
||||
Reference in new issue
Block a user