Files
fusion/packages/dashboard/app/hooks/useManagedDockerNodes.ts
Fusion cdb8539795 feat(FN-3108): deliver docker node onboarding and node workflow updates
- Add managed Docker node API client/routes, onboarding hook, and NodesView integration with new onboarding modal UX
- Refine Add Node, mobile nav, agent/node detail, and onboarding-related component styling/interaction flows
- Expand dashboard/core/cli test coverage for onboarding flows, node routes, insights persistence, and mobile regressions
- Add CLI/plugin packaging updates including bundled dependency-graph install and plugin schema initialization support

Fusion-Task-Id: FN-3108
2026-05-02 22:33:48 -07:00

65 lines
1.8 KiB
TypeScript

import { useCallback, useEffect, useState } from "react";
import type { ManagedDockerNodeInput } from "@fusion/core";
import type { DockerNodeInfo } from "../api";
import { createManagedDockerNode, listManagedDockerNodes } from "../api";
export interface UseManagedDockerNodesResult {
dockerNodes: DockerNodeInfo[];
loading: boolean;
error: string | null;
refresh: () => Promise<void>;
create: (input: ManagedDockerNodeInput) => Promise<DockerNodeInfo>;
}
export function useManagedDockerNodes(): UseManagedDockerNodesResult {
const [dockerNodes, setDockerNodes] = useState<DockerNodeInfo[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const refresh = useCallback(async () => {
try {
setError(null);
const data = await listManagedDockerNodes();
setDockerNodes(data);
} catch (err) {
setError(err instanceof Error ? err.message : "Failed to fetch managed Docker nodes");
}
}, []);
useEffect(() => {
let cancelled = false;
async function load() {
setLoading(true);
try {
const data = await listManagedDockerNodes();
if (!cancelled) {
setDockerNodes(data);
setError(null);
}
} catch (err) {
if (!cancelled) {
setError(err instanceof Error ? err.message : "Failed to fetch managed Docker nodes");
}
} finally {
if (!cancelled) {
setLoading(false);
}
}
}
void load();
return () => {
cancelled = true;
};
}, []);
const create = useCallback(async (input: ManagedDockerNodeInput): Promise<DockerNodeInfo> => {
const node = await createManagedDockerNode(input);
setDockerNodes((previous) => [...previous, node]);
return node;
}, []);
return { dockerNodes, loading, error, refresh, create };
}