import { useCallback, useEffect, useState } from 'react'; import { apiFetch } from '@/lib/api'; import type { TrivyStatus, TrivyUpdateCheck } from '@/types/security'; const INITIAL_STATUS: TrivyStatus = { available: false, version: null, source: 'none', autoUpdate: false, busy: false, }; export interface UseTrivyStatusResult { status: TrivyStatus; updateCheck: TrivyUpdateCheck | null; refresh: () => Promise; refreshUpdateCheck: () => Promise; } export function useTrivyStatus(): UseTrivyStatusResult { const [status, setStatus] = useState(INITIAL_STATUS); const [updateCheck, setUpdateCheck] = useState(null); const refresh = useCallback(async () => { try { const r = await apiFetch('/security/trivy-status'); if (!r.ok) return; const d = await r.json(); setStatus({ available: !!d.available, version: typeof d.version === 'string' ? d.version : null, source: d.source === 'managed' || d.source === 'host' ? d.source : 'none', autoUpdate: !!d.autoUpdate, busy: !!d.busy, }); } catch (err) { console.error('Failed to fetch Trivy status:', err); } }, []); const refreshUpdateCheck = useCallback(async () => { try { const r = await apiFetch('/security/trivy-update-check'); if (!r.ok) { setUpdateCheck(null); return; } const d = (await r.json()) as TrivyUpdateCheck; setUpdateCheck(d); } catch { setUpdateCheck(null); } }, []); useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect void refresh(); }, [refresh]); useEffect(() => { if (status.source === 'managed') { // eslint-disable-next-line react-hooks/set-state-in-effect void refreshUpdateCheck(); } else { setUpdateCheck(null); } }, [status.source, refreshUpdateCheck]); return { status, updateCheck, refresh, refreshUpdateCheck }; }