import { useState, useCallback, useEffect } from "react"; import { getDirective, getDirectiveGraph, startDirective, pauseDirective, resumeDirective, stopDirective, type DirectiveWithProgress, type DirectiveGraphResponse, type StartDirectiveResponse, } from "../lib/api"; interface UseDirectiveDetailResult { directive: DirectiveWithProgress | null; graph: DirectiveGraphResponse | null; loading: boolean; error: string | null; refresh: () => Promise; start: () => Promise; pause: () => Promise; resume: () => Promise; stop: () => Promise; } export function useDirectiveDetail(directiveId: string | undefined): UseDirectiveDetailResult { const [directive, setDirective] = useState(null); const [graph, setGraph] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const fetchDetail = useCallback(async () => { if (!directiveId) { setDirective(null); setGraph(null); return; } setLoading(true); setError(null); try { const [d, g] = await Promise.all([ getDirective(directiveId), getDirectiveGraph(directiveId).catch(() => null), ]); setDirective(d); setGraph(g); } catch (err) { console.error("Failed to fetch directive detail:", err); setError(err instanceof Error ? err.message : "Failed to fetch directive"); setDirective(null); setGraph(null); } finally { setLoading(false); } }, [directiveId]); useEffect(() => { fetchDetail(); }, [fetchDetail]); const start = useCallback(async (): Promise => { if (!directiveId) return null; try { const response = await startDirective(directiveId); await fetchDetail(); return response; } catch (err) { console.error("Failed to start directive:", err); setError(err instanceof Error ? err.message : "Failed to start directive"); return null; } }, [directiveId, fetchDetail]); const pause = useCallback(async (): Promise => { if (!directiveId) return false; try { await pauseDirective(directiveId); await fetchDetail(); return true; } catch (err) { console.error("Failed to pause directive:", err); setError(err instanceof Error ? err.message : "Failed to pause directive"); return false; } }, [directiveId, fetchDetail]); const resume = useCallback(async (): Promise => { if (!directiveId) return false; try { await resumeDirective(directiveId); await fetchDetail(); return true; } catch (err) { console.error("Failed to resume directive:", err); setError(err instanceof Error ? err.message : "Failed to resume directive"); return false; } }, [directiveId, fetchDetail]); const stop = useCallback(async (): Promise => { if (!directiveId) return false; try { await stopDirective(directiveId); await fetchDetail(); return true; } catch (err) { console.error("Failed to stop directive:", err); setError(err instanceof Error ? err.message : "Failed to stop directive"); return false; } }, [directiveId, fetchDetail]); return { directive, graph, loading, error, refresh: fetchDetail, start, pause, resume, stop, }; }