round28: Portscan-Retry fuer bekannte Dienste (Echo/Samsung-Falschmeldungen behoben), 7-Tage-Schwelle jetzt auch fuer einzelne Dienste, geraeteuebergreifender Scan-Status in der Navigation

This commit is contained in:
2026-07-24 12:49:26 +02:00
parent 430b79763c
commit f5845ec762
7 changed files with 116 additions and 8 deletions

View File

@@ -0,0 +1,48 @@
import { useEffect, useState } from "react";
interface ScanActivity {
running: boolean;
pendingCount: number;
}
function readJson<T>(key: string, fallback: T): T {
try {
const raw = sessionStorage.getItem(`launchpad:${key}`);
return raw !== null ? (JSON.parse(raw) as T) : fallback;
} catch {
return fallback;
}
}
function computeActivity(): ScanActivity {
const running = readJson("scanner:bulkRunning", false);
const staleServices = readJson<unknown[]>("scanner:bulkStaleServices", []);
const nameChanges = readJson<unknown[]>("scanner:bulkNameChanges", []);
const staleDevices = readJson<unknown[]>("scanner:staleDevices", []);
const deviceChanges = readJson<unknown[]>("scanner:deviceChanges", []);
const pendingCount =
staleServices.length + nameChanges.length + staleDevices.length + deviceChanges.length;
return { running, pendingCount };
}
/**
* Geräteübergreifender Hinweis, ob gerade ein Scan läuft oder es
* unbestätigte Scan-Ergebnisse gibt (siehe Scanner-Seite, dort alles über
* usePersistedState/sessionStorage gehalten) - für ein Abzeichen am
* "Scanner"-Navigationspunkt, sichtbar von jeder Admin-Seite aus.
*
* sessionStorage-Änderungen aus einer ANDEREN Komponente im selben Tab
* lösen kein "storage"-Event aus (das feuert nur tab-übergreifend) - daher
* hier bewusst ein einfaches, günstiges Polling statt eines echten
* Reaktivitäts-Mechanismus.
*/
export function useScanActivity(): ScanActivity {
const [activity, setActivity] = useState<ScanActivity>(() => computeActivity());
useEffect(() => {
const interval = setInterval(() => setActivity(computeActivity()), 1500);
return () => clearInterval(interval);
}, []);
return activity;
}