fix(ui): очищать недоступные интерфейсы при загрузке
This commit is contained in:
1 parent
ab334764cf
commit
2bdcc1621f
5 files changed
+62
-26
No files matched your search
+19
-24
@@ -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
|
||||
|
||||
Reference in new issue
Block a user