import { useState, useEffect } from "react"; import { CheckCircle, AlertCircle, ExternalLink, RefreshCw, Terminal } from "lucide-react"; import type { DockerProvisionResult } from "@fusion/core"; import "./DockerProvisioningStatus.css"; const STAGES = [ "Pulling image...", "Creating container...", "Starting container...", "Registering node...", ]; const STAGE_INTERVAL_MS = 2000; export interface DockerProvisioningStatusProps { result?: DockerProvisionResult; isProvisioning: boolean; error?: string | null; onRetry?: () => void; onViewNode?: (nodeId: string) => void; } export function DockerProvisioningStatus({ result, isProvisioning, error, onRetry, onViewNode, }: DockerProvisioningStatusProps) { const [stageIndex, setStageIndex] = useState(0); // Animate stages during provisioning useEffect(() => { if (!isProvisioning || result) { return; } setStageIndex(0); const timer = setInterval(() => { setStageIndex((prev) => (prev < STAGES.length - 1 ? prev + 1 : prev)); }, STAGE_INTERVAL_MS); return () => clearInterval(timer); }, [isProvisioning, result]); // Provisioning state if (isProvisioning && !result) { return (
Creating Docker node...
{STAGES[stageIndex]}
); } // Success state if (result?.success) { const durationSec = result.durationMs ? (result.durationMs / 1000).toFixed(1) : null; return (
Node created successfully!
{result.containerId && (
Container: {result.containerId.slice(0, 12)}
)} {durationSec && (
Provisioned in {durationSec}s
)} {result.nodeId && onViewNode && ( )}
); } // Failure state const displayError = error ?? result?.error; const failedStage = result?.failedStage; return (
{displayError ?? "Provisioning failed"}
{failedStage && (
Failed at: {failedStage}
)} {result?.containerName && (
docker logs {result.containerName}
)} {onRetry && ( )}
); }