/** * @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 allAuthItems = [ { label: 'Login with Google', value: AuthType.LOGIN_WITH_GOOGLE_PERSONAL, }, { label: 'Gemini API Key', value: AuthType.USE_GEMINI }, { label: 'Login with Google Work', value: AuthType.LOGIN_WITH_GOOGLE_ENTERPRISE, }, { label: 'Vertex API Key', value: AuthType.USE_VERTEX_AI }, ]; const isSelectedAuthInMore = allAuthItems .slice(2) .some((item) => item.value === settings.merged.selectedAuthType); const [showAll, setShowAll] = useState(isSelectedAuthInMore); const initialAuthItems = [ ...allAuthItems.slice(0, 2), { label: 'More...', value: 'more' }, ]; const items = showAll ? allAuthItems : initialAuthItems; let initialAuthIndex = items.findIndex( (item) => item.value === settings.merged.selectedAuthType, ); if (initialAuthIndex === -1) { initialAuthIndex = 0; } const handleAuthSelect = (authMethod: string) => { if (authMethod === 'more') { setShowAll(true); return; } 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) ); }