diff --git a/ui/src/components/NexusOnboardingWizard.tsx b/ui/src/components/NexusOnboardingWizard.tsx index 2f86ebff..5e61199a 100644 --- a/ui/src/components/NexusOnboardingWizard.tsx +++ b/ui/src/components/NexusOnboardingWizard.tsx @@ -23,6 +23,7 @@ import { HardwareSummaryStep } from "./onboarding/HardwareSummaryStep"; import { ProviderSelectionStep } from "./onboarding/ProviderSelectionStep"; import { OnboardingSummaryStep } from "./onboarding/OnboardingSummaryStep"; import { VoiceStep } from "./onboarding/VoiceStep"; +import { TelegramStep } from "./onboarding/TelegramStep"; import { useHardwareInfo } from "../hooks/useHardwareInfo"; import { updateNexusSettings, type NexusMode } from "../api/hardware"; import { useChatPanel } from "../context/ChatPanelContext"; @@ -38,7 +39,7 @@ function deriveProviderLabel( return "None selected"; } -// [nexus] 6-step onboarding wizard: hardware detection → mode selection → provider selection → voice → root directory → summary +// [nexus] 7-step onboarding wizard: hardware detection → mode selection → provider selection → voice → telegram → root directory → summary export function OnboardingWizard() { const { onboardingOpen, onboardingOptions, closeOnboarding } = useDialog(); const { companies, setSelectedCompanyId, loading: companiesLoading } = useCompany(); @@ -66,7 +67,7 @@ export function OnboardingWizard() { setRouteDismissed(false); }, [location.pathname]); - // Step state: 1 = hardware detection, 2 = mode selection, 3 = provider selection, 4 = voice, 5 = root directory, 6 = summary + // Step state: 1 = hardware detection, 2 = mode selection, 3 = provider selection, 4 = voice, 5 = telegram, 6 = root directory, 7 = summary const [step, setStep] = useState(1); // Mode state: "both" pre-selected per UI-SPEC @@ -135,7 +136,7 @@ export function OnboardingWizard() { closeOnboarding(); } - // [nexus] Shared workspace creation logic used by both handleSubmit (step 4 direct) and handleStartChat (step 5) + // [nexus] Shared workspace creation logic used by both handleSubmit (step 4 direct) and handleStartChat (step 6) async function createWorkspace() { // Step 1: Create workspace (company) named after VOCAB.appName const company = await companiesApi.create({ name: VOCAB.appName }); @@ -262,7 +263,7 @@ export function OnboardingWizard() { async function handleStartChat() { // Guard: claude_local requires rootDir if (defaultAdapter === "claude_local" && !rootDir.trim()) { - setError("Root directory is required for Claude Code. Go back to step 5 to set it."); + setError("Root directory is required for Claude Code. Go back to step 6 to set it."); return; } @@ -302,7 +303,7 @@ export function OnboardingWizard() { > {/* Step indicator */}

- {step === 6 ? "Summary" : `Step ${step} of 5`} + {step === 7 ? "Summary" : `Step ${step} of 6`}

{/* Step 1 — Hardware Detection */} @@ -442,8 +443,16 @@ export function OnboardingWizard() { )} - {/* Step 5 — Root Directory (was step 4) */} + {/* Step 5 — Telegram Bridge */} {step === 5 && ( + setStep(6)} + onBack={() => setStep(4)} + /> + )} + + {/* Step 6 — Root Directory (was step 5, now step 6) */} + {step === 6 && ( <> {/* Header */}
@@ -487,7 +496,7 @@ export function OnboardingWizard() {