import { useEffect, useState } from "react"; interface ScanActivity { running: boolean; pendingCount: number; } /** * Geräteübergreifender Hinweis, ob gerade ein Scan läuft oder es * unbestätigte Scan-Ergebnisse gibt - für ein Abzeichen am * "Scanner"-Navigationspunkt, sichtbar von jeder Admin-Seite UND jedem * Gerät/Browser aus, da der Zustand jetzt vom BACKEND abgefragt wird * (siehe apps/backend/src/scanJobs.ts), nicht mehr aus dem lokalen * sessionStorage des jeweiligen Browsers gelesen wird - Ersteres kann * naturgemäß nicht geräteübergreifend sein. */ export function useScanActivity(): ScanActivity { const [activity, setActivity] = useState({ running: false, pendingCount: 0 }); useEffect(() => { let cancelled = false; async function poll() { try { const [devicesRes, apisRes] = await Promise.all([ fetch("/api/scan/devices/all/status"), fetch("/api/scan/apis/status"), ]); if (cancelled) return; const devicesStatus = devicesRes.ok ? await devicesRes.json() : null; const apisStatus = apisRes.ok ? await apisRes.json() : null; const running = !!devicesStatus?.running || !!apisStatus?.running; const lastResult = devicesStatus?.lastResult; const pendingCount = lastResult ? (lastResult.nameChanges?.length ?? 0) + (lastResult.staleServices?.length ?? 0) : 0; setActivity({ running, pendingCount }); } catch { // Netzwerk-Hänger beim Poll ignorieren, nächster Versuch folgt. } } poll(); const interval = setInterval(poll, 2000); return () => { cancelled = true; clearInterval(interval); }; }, []); return activity; }