From 1b692b8cde4a888c8a35af69231f181b57bf5619 Mon Sep 17 00:00:00 2001 From: soryu Date: Fri, 6 Feb 2026 20:06:30 +0000 Subject: Fix: Cleanup old chain code --- makima/frontend/src/hooks/useDirectiveDetail.ts | 125 ++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 makima/frontend/src/hooks/useDirectiveDetail.ts (limited to 'makima/frontend/src/hooks/useDirectiveDetail.ts') diff --git a/makima/frontend/src/hooks/useDirectiveDetail.ts b/makima/frontend/src/hooks/useDirectiveDetail.ts new file mode 100644 index 0000000..1167242 --- /dev/null +++ b/makima/frontend/src/hooks/useDirectiveDetail.ts @@ -0,0 +1,125 @@ +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, + }; +} -- cgit v1.2.3