import { useState, useEffect, useCallback } from "react"; import { X, Loader2, FolderPlus, CheckCircle } from "lucide-react"; import type { ProjectInfo, ProjectCreateInput } from "../api"; import { registerProject } from "../api"; export interface SetupWizardModalProps { /** Called when a single project is registered */ onProjectRegistered: (project: ProjectInfo) => void; /** Called when wizard is closed (completed or cancelled) */ onClose?: () => void; } type WizardStep = "manual" | "complete"; interface WizardState { step: WizardStep; manualPath: string; manualName: string; manualIsolationMode: "in-process" | "child-process"; isRegistering: boolean; error: string | null; } /** * Setup wizard for first-run project registration. * * Provides a wizard for new users to add their first project manually. * * @example * ```tsx * console.log(`Registered ${project.name}`)} * onClose={() => setShowWizard(false)} * /> * ``` */ export function SetupWizardModal({ onProjectRegistered, onClose, }: SetupWizardModalProps) { const [isOpen, setIsOpen] = useState(true); const [state, setState] = useState({ step: "manual", manualPath: "", manualName: "", manualIsolationMode: "in-process", isRegistering: false, error: null, }); const handleClose = useCallback(() => { setIsOpen(false); onClose?.(); }, [onClose]); const handleManualRegister = useCallback(async () => { if (!state.manualPath || !state.manualName) return; setState((prev) => ({ ...prev, isRegistering: true, error: null })); try { const input: ProjectCreateInput = { name: state.manualName, path: state.manualPath, isolationMode: state.manualIsolationMode, }; const result = await registerProject(input); onProjectRegistered(result); setState((prev) => ({ ...prev, step: "complete", isRegistering: false, })); } catch (err) { setState((prev) => ({ ...prev, isRegistering: false, error: err instanceof Error ? err.message : "Failed to register project", })); } }, [state.manualPath, state.manualName, state.manualIsolationMode, onProjectRegistered]); if (!isOpen) return null; return (
{/* Header */}

{state.step === "manual" && "Welcome to kb"} {state.step === "complete" && "Setup Complete!"}

{state.step !== "complete" && ( )}
{/* Content */}
{/* Manual Step */} {state.step === "manual" && (

Let's set up your first kb project. Enter the path to your project directory.

setState((prev) => ({ ...prev, manualPath: e.target.value })) } placeholder="/path/to/your/project" />

Absolute path to your project directory

setState((prev) => ({ ...prev, manualName: e.target.value })) } placeholder="my-project" />
{state.error && (
{state.error}
)}
)} {/* Complete Step */} {state.step === "complete" && (

All Set!

Your project has been registered successfully.

You can add more projects anytime from the project overview.

)}
{/* Footer */}
{state.step === "manual" && ( )} {state.step === "complete" && ( )}
); }