/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import React, { useState } from 'react'; import { Box, Text, useInput } from 'ink'; import { Colors } from '../colors.js'; import { RadioButtonSelect } from './shared/RadioButtonSelect.js'; import { LoadedSettings, SettingScope } from '../../config/settings.js'; import { AuthType } from '@gemini-cli/core'; import { validateAuthMethod } from '../../config/auth.js'; interface AuthDialogProps { onSelect: (authMethod: string | undefined, scope: SettingScope) => void; onHighlight: (authMethod: string | undefined) => void; settings: LoadedSettings; initialErrorMessage?: string | null; } export function AuthDialog({ onSelect, onHighlight, settings, initialErrorMessage, }: AuthDialogProps): React.JSX.Element { const [errorMessage, setErrorMessage] = useState( initialErrorMessage || null, ); const authItems = [ { label: 'Login with Google Personal Account', value: AuthType.LOGIN_WITH_GOOGLE_PERSONAL, }, { label: 'Gemini API Key', value: AuthType.USE_GEMINI }, { label: 'Login with GCP Project and Google Work Account', value: AuthType.LOGIN_WITH_GOOGLE_ENTERPRISE, }, { label: 'Vertex AI', value: AuthType.USE_VERTEX_AI }, ]; let initialAuthIndex = authItems.findIndex( (item) => item.value === settings.merged.selectedAuthType, ); if (initialAuthIndex === -1) { initialAuthIndex = 0; } const handleAuthSelect = (authMethod: string) => { const error = validateAuthMethod(authMethod); if (error) { setErrorMessage(error); } else { setErrorMessage(null); onSelect(authMethod, SettingScope.User); } }; useInput((_input, key) => { if (key.escape) { onSelect(undefined, SettingScope.User); } }); return ( Select Auth Method {errorMessage && ( {errorMessage} )} (Use Enter to select) ); }