/** * @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 '@google/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 items = [ { label: 'Login with Google', value: AuthType.LOGIN_WITH_GOOGLE_PERSONAL, }, { label: 'Gemini API Key (AI Studio)', value: AuthType.USE_GEMINI }, { label: 'Vertex AI', value: AuthType.USE_VERTEX_AI }, ]; let initialAuthIndex = items.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) { if (settings.merged.selectedAuthType === undefined) { // Prevent exiting if no auth method is set setErrorMessage( 'You must select an auth method to proceed. Press Ctrl+C twice to exit.', ); return; } onSelect(undefined, SettingScope.User); } }); return ( Select Auth Method {errorMessage && ( {errorMessage} )} (Use Enter to select) Terms of Services and Privacy Notice for Gemini CLI { 'https://github.com/google-gemini/gemini-cli/blob/main/docs/tos-privacy.md' } ); }