import { useEffect, useMemo, useState } from "react"; import type { FusionShellApi, ShellConnectionState } from "../types/native-shell"; import "./NativeShellOnboardingModal.css"; function buildRemoteDashboardUrl(serverUrl: string, authToken?: string | null): string { const url = new URL(serverUrl); if (authToken) { url.searchParams.set("rt", authToken); } return url.toString(); } interface NativeShellOnboardingModalProps { open: boolean; shellApi: FusionShellApi; shellState: ShellConnectionState; onComplete: () => void; } export function NativeShellOnboardingModal({ open, shellApi, shellState, onComplete }: NativeShellOnboardingModalProps) { const [mode, setMode] = useState<"local" | "remote">(shellState.desktopMode ?? "remote"); const [name, setName] = useState("Remote Server"); const [serverUrl, setServerUrl] = useState(""); const [authToken, setAuthToken] = useState(""); const [error, setError] = useState(null); const [scanning, setScanning] = useState(false); const [submitting, setSubmitting] = useState(false); const isDesktop = shellState.host === "desktop-shell"; useEffect(() => { if (isDesktop) { setMode(shellState.desktopMode ?? "remote"); } }, [isDesktop, shellState.desktopMode]); const canSubmit = useMemo(() => { if (isDesktop && mode === "local") return true; return serverUrl.trim().length > 0; }, [isDesktop, mode, serverUrl]); if (!open) { return null; } return (

Welcome to Fusion

Fusion helps you plan, run, and review AI-assisted engineering work.

{isDesktop && (
)} {(!isDesktop || mode === "remote") && ( <> setName(event.target.value)} /> setServerUrl(event.target.value)} placeholder="https://your-fusion-host" /> setAuthToken(event.target.value)} /> )} {error &&

{error}

}
); }