"use client"; import { useEffect, useState } from "react"; import { Loader2, ServerCrash, Smartphone } from "lucide-react"; import { EmulatorPane } from "./EmulatorPane"; import { useEmulator } from "@/hooks/useEmulator"; interface VSCodeFrameProps { workspaceId: string; } export function VSCodeFrame({ workspaceId }: VSCodeFrameProps) { const [status, setStatus] = useState<"loading" | "ready" | "error">("loading"); const [androidPort, setAndroidPort] = useState(null); const [appetizeUrl, setAppetizeUrl] = useState(null); const [buildLogs, setBuildLogs] = useState([]); const { isOpen, platform, refreshKey, isLoading, setIsOpen, toggleOpen, changePlatform, refreshIframe, } = useEmulator("android"); useEffect(() => { let isMounted = true; let events: EventSource | null = null; const checkStatus = async () => { try { const res = await fetch(`/api/workspace/status?id=${workspaceId}`); const data = await res.json(); if (data.ready && isMounted) { setStatus("ready"); return true; } } catch (e) { console.error("Status probe failed:", e); } return false; }; const init = async () => { const isReady = await checkStatus(); if (isReady || !isMounted) return; events = new EventSource(`/api/workspace/stream?id=${workspaceId}&withAndroid=true`); const handleLog = (e: Event) => { if (!isMounted) return; const me = e as MessageEvent; try { const msg = JSON.parse(me.data); setBuildLogs((prev) => [...prev, msg]); } catch { setBuildLogs((prev) => [...prev, me.data]); } }; const handleReady = (e: Event) => { if (!isMounted) return; const me = e as MessageEvent; try { const data = JSON.parse(me.data); if (data.success) { if (data.appetizeUrl) setAppetizeUrl(data.appetizeUrl); if (data.androidPort) { setAndroidPort(String(data.androidPort)); setIsOpen(true); } setStatus("ready"); // Instant ready instead of 1.5s delay } else { setStatus("error"); } } catch (e: unknown) { console.error(`[WATCHDOG:ERR] ${e instanceof Error ? e.message : String(e)}`); } if (events) { events.close(); } }; const handleError = () => { if (isMounted) setStatus("error"); if (events) { events.close(); } }; events.addEventListener("log", handleLog); events.addEventListener("ready", handleReady); events.addEventListener("error", handleError); }; void init(); return () => { isMounted = false; if (events) { events.close(); events = null; } }; }, [workspaceId, setIsOpen]); if (status === "loading") { return (

Syncing Environment...

CodeVerse Studio Engine
{buildLogs.map((log, i) => (
{log}
))}
_
[ORCHESTRATOR] Binding LSPs, mapping virtual volumes, and hydrating Nix profile.
); } if (status === "error") { return (

Deployment Engine Failure

The orchestration layer failed to provision workspace {workspaceId}. This usually occurs due to Docker socket timeouts or resource exhaustion in limited cloud environments.

); } const targetUrl = `/workspace/${encodeURIComponent(workspaceId)}/`; return (