/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { useCallback } from 'react'; import { Box } from 'ink'; import { Colors } from '../../colors.js'; import { useKeypress } from '../../hooks/useKeypress.js'; import { WelcomeStep, type WelcomeChoice } from './WelcomeStep.js'; import { ProviderSelectStep } from './ProviderSelectStep.js'; import { ModelSelectStep } from './ModelSelectStep.js'; import { AuthMethodStep } from './AuthMethodStep.js'; import { AuthenticationStep } from './AuthenticationStep.js'; import { CompletionStep } from './CompletionStep.js'; import { SkipExitStep } from './SkipExitStep.js'; import type { WelcomeState, WelcomeActions, ModelInfo, } from '../../hooks/useWelcomeOnboarding.js'; import { getBorderStyle } from '../../contexts/UnicodeRenderingContext.js'; interface WelcomeDialogProps { state: WelcomeState; actions: WelcomeActions; availableProviders: string[]; availableModels: ModelInfo[]; triggerAuth: ( provider: string, method: 'oauth' | 'api_key', apiKey?: string, ) => Promise; } interface WelcomeStepRendererProps { state: WelcomeState; actions: WelcomeActions; availableProviders: string[]; availableModels: ModelInfo[]; triggerAuth: ( provider: string, method: 'oauth' | 'api_key', apiKey?: string, ) => Promise; handleWelcomeSelect: (choice: WelcomeChoice) => void; } const WelcomeStepRenderer: React.FC = ({ state, actions, availableProviders, availableModels, triggerAuth, handleWelcomeSelect, }) => { switch (state.step) { case 'welcome': return ; case 'provider': return ( ); case 'model': if (!state.selectedProvider) return null; return ( ); case 'auth_method': if (!state.selectedProvider) return null; return ( ); case 'authenticating': if (!state.selectedProvider || !state.selectedAuthMethod) return null; return ( ); case 'completion': if (!state.selectedProvider || !state.selectedAuthMethod) return null; return ( ); case 'skipped': return ; default: return null; } }; export const WelcomeDialog: React.FC = ({ state, actions, availableProviders, availableModels, triggerAuth, }) => { useKeypress( (key) => { if (key.name === 'escape' && !state.authInProgress) { actions.skipSetup(); } }, { isActive: state.step !== 'completion' && state.step !== 'skipped' }, ); const handleWelcomeSelect = useCallback( (choice: WelcomeChoice) => { if (choice === 'setup') { actions.startSetup(); } else { actions.skipSetup(); } }, [actions], ); return ( ); };