From b1834e988bcdf3a874dab2f6e5f5c077be85a81b Mon Sep 17 00:00:00 2001 From: shats Date: Wed, 18 Feb 2026 13:06:00 +0700 Subject: [PATCH] feat(NetworkMapDashboard): implement cache handling for ping and speed requests to optimize data fetching --- frontend/src/NetworkMapDashboard.jsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/frontend/src/NetworkMapDashboard.jsx b/frontend/src/NetworkMapDashboard.jsx index 5d5f73d..495a952 100644 --- a/frontend/src/NetworkMapDashboard.jsx +++ b/frontend/src/NetworkMapDashboard.jsx @@ -78,11 +78,14 @@ export default function NetworkMapDashboard() { const [error, setError] = useState(null); const pingAbortRef = useRef(false); const speedAbortRef = useRef(false); + /** Время применения кеша от планировщика (чтобы не запускать пинг/скорость повторно при открытии) */ + const cacheAppliedAtRef = useRef(null); /** Связи строятся из интерфейсов раздела «Сетевые настройки» (/network-config), tunnelInterfaces */ const fetchData = useCallback(async () => { setLoading(true); setError(null); + cacheAppliedAtRef.current = null; try { const [serversRes, configRes, uiSettingsRes, cacheRes] = await Promise.all([ api.get('/servers'), @@ -142,6 +145,7 @@ export default function NetworkMapDashboard() { Object.keys(cache.pingMap || {}).forEach((k) => { pingTimestampsRef.current[k] = cache.updatedAt; }); + cacheAppliedAtRef.current = cache.updatedAt; } else { setSpeedMap({}); } @@ -276,21 +280,29 @@ export default function NetworkMapDashboard() { useEffect(() => { if (!loading && servers.length > 0 && connections.length > 0) { + const cacheMaxAgeMs = Math.max((pingCacheSeconds || 60) * 1000, 60 * 1000); + if (cacheAppliedAtRef.current && Date.now() - cacheAppliedAtRef.current < cacheMaxAgeMs) { + return; + } requestPings(); } return () => { pingAbortRef.current = true; }; - }, [loading, connections.length]); + }, [loading, connections.length, pingCacheSeconds, requestPings]); useEffect(() => { if (!loading && connections.length > 0) { + const cacheMaxAgeMs = Math.max((pingCacheSeconds || 60) * 1000, 60 * 1000); + if (cacheAppliedAtRef.current && Date.now() - cacheAppliedAtRef.current < cacheMaxAgeMs) { + return; + } requestSpeeds(); } return () => { speedAbortRef.current = true; }; - }, [loading, connections.length, requestSpeeds]); + }, [loading, connections.length, pingCacheSeconds, requestSpeeds]); const handleRefreshPings = () => { requestPings();