fix(ui): очищать недоступные интерфейсы при загрузке

This commit is contained in:
Denozordec committed 2026-10-04 03:06:47 +07:00
1 parent ab334764cf
commit 2bdcc1621f
5 files changed
+62 -26

No files matched your search

+19 -24
View File
@@ -279,6 +279,14 @@ function filterActiveInterfaces<T extends { running?: boolean; disabled?: boolea
return list.filter(isActiveRouterOsInterface)
}
function clearInactiveSpeedInterfaces(draft: SpeedProbeRow, serverId: string, interfaces: Array<{ name: string; running: boolean; disabled: boolean }>): SpeedProbeRow {
const active = filterActiveInterfaces(interfaces)
const unavailable = (name: string) => name !== "" && !active.some(item => item.name === name)
const srcInterface = draft.srcServerId === serverId && unavailable(draft.srcInterface) ? "" : draft.srcInterface
const dstInterface = draft.dstServerId === serverId && unavailable(draft.dstInterface) ? "" : draft.dstInterface
return srcInterface === draft.srcInterface && dstInterface === draft.dstInterface ? draft : { ...draft, srcInterface, dstInterface }
}
function serverMatchesSearch(server: Server, raw: string): boolean {
const q = raw.trim().toLowerCase()
if (!q) return true
@@ -1291,37 +1299,24 @@ function UptimePageContent({ selectedProbeId, allProbesHref }: { selectedProbeId
const loadSpeedInterfaces = useCallback(async (serverId: string) => {
if (!liveApi) return
if (!serverId || speedIfaces[serverId]) return
if (!serverId) return
const cached = speedIfaces[serverId]
if (cached !== undefined) {
setSpeedDraft(previous => clearInactiveSpeedInterfaces(previous, serverId, cached))
return
}
const id = Number.parseInt(serverId, 10)
if (!Number.isFinite(id)) return
try {
const res = await apiFetch<{ interfaces: Array<{ name: string; running: boolean; disabled: boolean; addresses: string[] }> }>(`/api/uptime/speed-test/endpoints/${id}/interfaces`)
setSpeedIfaces((prev) => ({ ...prev, [serverId]: res.interfaces ?? [] }))
const interfaces = res.interfaces ?? []
setSpeedIfaces((prev) => ({ ...prev, [serverId]: interfaces }))
setSpeedDraft(previous => clearInactiveSpeedInterfaces(previous, serverId, interfaces))
} catch {
setSpeedIfaces((prev) => ({ ...prev, [serverId]: [] }))
setSpeedDraft(previous => clearInactiveSpeedInterfaces(previous, serverId, []))
}
}, [apiFetch, liveApi, speedIfaces])
/** После загрузки списков интерфейсов сбросить выбор, если интерфейс не активен или отсутствует в списке */
useEffect(() => {
if (!speedSheetOpen) return
setSpeedDraft((prev) => {
const rawSrc = speedIfaces[prev.srcServerId]
const rawDst = speedIfaces[prev.dstServerId]
let srcInterface = prev.srcInterface
let dstInterface = prev.dstInterface
if (rawSrc !== undefined) {
const active = filterActiveInterfaces(rawSrc)
if (srcInterface && !active.some((i) => i.name === srcInterface)) srcInterface = ""
}
if (rawDst !== undefined) {
const active = filterActiveInterfaces(rawDst)
if (dstInterface && !active.some((i) => i.name === dstInterface)) dstInterface = ""
}
if (srcInterface === prev.srcInterface && dstInterface === prev.dstInterface) return prev
return { ...prev, srcInterface, dstInterface }
})
}, [speedSheetOpen, speedIfaces])
}, [apiFetch, liveApi, speedIfaces, setSpeedDraft])
useEffect(() => {
if (!sheetOpen) return