import { useState, useEffect, useCallback, useRef } from "react"; import { Loader2, CheckCircle2, XCircle, Zap } from "lucide-react"; import { Button } from "@/components/ui/button"; import { api } from "@/shared/api"; import type { RuntimePingStatus } from "@/shared/types"; const pingStatusConfig: Record< RuntimePingStatus, { label: string; icon: typeof Loader2; color: string } > = { pending: { label: "Waiting for daemon...", icon: Loader2, color: "text-muted-foreground" }, running: { label: "Running test...", icon: Loader2, color: "text-info" }, completed: { label: "Connected", icon: CheckCircle2, color: "text-success" }, failed: { label: "Failed", icon: XCircle, color: "text-destructive" }, timeout: { label: "Timeout", icon: XCircle, color: "text-warning" }, }; export function PingSection({ runtimeId }: { runtimeId: string }) { const [status, setStatus] = useState(null); const [output, setOutput] = useState(""); const [error, setError] = useState(""); const [durationMs, setDurationMs] = useState(null); const [testing, setTesting] = useState(false); const pollRef = useRef | null>(null); const cleanup = useCallback(() => { if (pollRef.current) { clearInterval(pollRef.current); pollRef.current = null; } }, []); useEffect(() => cleanup, [cleanup]); const handleTest = async () => { cleanup(); setTesting(true); setStatus("pending"); setOutput(""); setError(""); setDurationMs(null); try { const ping = await api.pingRuntime(runtimeId); pollRef.current = setInterval(async () => { try { const result = await api.getPingResult(runtimeId, ping.id); setStatus(result.status as RuntimePingStatus); if (result.status === "completed") { setOutput(result.output ?? ""); setDurationMs(result.duration_ms ?? null); setTesting(false); cleanup(); } else if (result.status === "failed" || result.status === "timeout") { setError(result.error ?? "Unknown error"); setDurationMs(result.duration_ms ?? null); setTesting(false); cleanup(); } } catch { // ignore poll errors } }, 2000); } catch { setStatus("failed"); setError("Failed to initiate test"); setTesting(false); } }; const config = status ? pingStatusConfig[status] : null; const Icon = config?.icon; const isActive = status === "pending" || status === "running"; return (
{config && Icon && ( {config.label} {durationMs != null && ( ({(durationMs / 1000).toFixed(1)}s) )} )}
{status === "completed" && output && (
{output}
)} {(status === "failed" || status === "timeout") && error && (

{error}

)}
); }