import { useCallback, useEffect, useRef, useState } from "react"; import { Loader2 } from "lucide-react"; import { fetchCursorCliStatus, setCursorCliEnabled, type CursorCliStatus } from "../api"; import { ProviderIcon } from "./ProviderIcon"; import "./CursorCliProviderCard.css"; interface CursorCliProviderCardProps { authenticated: boolean; compact?: boolean; onToggled?: (nextEnabled: boolean) => void; } export function CursorCliProviderCard({ authenticated, compact = false, onToggled }: CursorCliProviderCardProps) { const [status, setStatus] = useState(null); const [busy, setBusy] = useState<"enabling" | "disabling" | "testing" | null>(null); const mountedRef = useRef(true); useEffect(() => { mountedRef.current = true; return () => { mountedRef.current = false; }; }, []); const refresh = useCallback(async () => { try { const next = await fetchCursorCliStatus(); if (mountedRef.current) setStatus(next); return next; } catch { return null; } }, []); useEffect(() => { void refresh(); }, [refresh]); const handleToggle = useCallback( async (next: boolean) => { setBusy(next ? "enabling" : "disabling"); try { const result = await setCursorCliEnabled(next); onToggled?.(result.enabled); await refresh(); } finally { if (mountedRef.current) setBusy(null); } }, [onToggled, refresh], ); const currentlyEnabled = status?.enabled ?? authenticated; const binaryAvailable = status?.binary.available ?? false; const actions = ( <> {currentlyEnabled ? ( ) : ( )} ); const statusText = !status ? "Probing local CLI…" : !status.binary.available ? status.binary.reason ?? "`cursor-agent` not found on PATH" : currentlyEnabled ? `Connected${status.binary.version ? ` — ${status.binary.version}` : ""}` : "Detected. Click Enable to route calls through Cursor CLI."; if (compact) { return (
Cursor — via Cursor CLI {currentlyEnabled ? "✓ Active" : "✗ Not connected"}
{actions}
{statusText}
); } return (
Cursor — via Cursor CLI Route AI calls through your local Cursor agent runtime. {statusText}
{actions}
); }