@kinvolk/headlamp-plugin
Version:
The needed infrastructure for building Headlamp plugins.
61 lines (52 loc) • 2.2 kB
text/typescript
/**
* useProactiveDiagnosis hook
*
* Provides React state bindings for the ProactiveDiagnosisManager singleton.
* - Subscribes to manager events and keeps local state in sync.
* - Returns the list of diagnoses, loading state, and control functions.
*/
import { useCallback, useEffect, useState } from 'react';
import { DiagnosisResult, proactiveDiagnosisManager } from '../utils/ProactiveDiagnosisManager';
export function useProactiveDiagnosis() {
const [diagnoses, setDiagnoses] = useState<DiagnosisResult[]>(
proactiveDiagnosisManager.getAllDiagnoses()
);
const [isCycleRunning, setIsCycleRunning] = useState(false);
const [scrollToEventUid, setScrollToEventUid] = useState<string | null>(
proactiveDiagnosisManager.getScrollToEventUid()
);
useEffect(() => {
const handleUpdate = () => {
setDiagnoses(proactiveDiagnosisManager.getAllDiagnoses());
};
const handleCycleStart = () => setIsCycleRunning(true);
const handleCycleEnd = () => {
setIsCycleRunning(false);
handleUpdate();
};
const handleCacheCleared = () => handleUpdate();
const handleScrollTo = (uid: string) => setScrollToEventUid(uid);
proactiveDiagnosisManager.on('diagnosis-update', handleUpdate);
proactiveDiagnosisManager.on('cycle-start', handleCycleStart);
proactiveDiagnosisManager.on('cycle-end', handleCycleEnd);
proactiveDiagnosisManager.on('cache-cleared', handleCacheCleared);
proactiveDiagnosisManager.on('scroll-to-event', handleScrollTo);
return () => {
proactiveDiagnosisManager.removeListener('diagnosis-update', handleUpdate);
proactiveDiagnosisManager.removeListener('cycle-start', handleCycleStart);
proactiveDiagnosisManager.removeListener('cycle-end', handleCycleEnd);
proactiveDiagnosisManager.removeListener('cache-cleared', handleCacheCleared);
proactiveDiagnosisManager.removeListener('scroll-to-event', handleScrollTo);
};
}, []);
const clearScrollTarget = useCallback(() => {
setScrollToEventUid(null);
proactiveDiagnosisManager.clearScrollToEventUid();
}, []);
return {
diagnoses,
isCycleRunning,
scrollToEventUid,
clearScrollTarget,
};
}