import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button } from '@/components/ui/Button'; import { HeaderInputList } from '@/components/ui/HeaderInputList'; import { Input } from '@/components/ui/Input'; import { Modal } from '@/components/ui/Modal'; import type { GeminiKeyConfig } from '@/types'; import { headersToEntries } from '@/utils/headers'; import { excludedModelsToText } from '../utils'; import type { GeminiFormState, ProviderModalProps } from '../types'; interface GeminiModalProps extends ProviderModalProps { isSaving: boolean; } const buildEmptyForm = (): GeminiFormState => ({ apiKey: '', prefix: '', baseUrl: '', headers: [], excludedModels: [], excludedText: '', }); export function GeminiModal({ isOpen, editIndex, initialData, onClose, onSave, isSaving, }: GeminiModalProps) { const { t } = useTranslation(); const [form, setForm] = useState(buildEmptyForm); useEffect(() => { if (!isOpen) return; if (initialData) { // eslint-disable-next-line react-hooks/set-state-in-effect setForm({ ...initialData, headers: headersToEntries(initialData.headers), excludedText: excludedModelsToText(initialData.excludedModels), }); return; } setForm(buildEmptyForm()); }, [initialData, isOpen]); const handleSave = () => { void onSave(form, editIndex); }; return ( } > setForm((prev) => ({ ...prev, apiKey: e.target.value }))} /> setForm((prev) => ({ ...prev, prefix: e.target.value }))} hint={t('ai_providers.prefix_hint')} /> setForm((prev) => ({ ...prev, baseUrl: e.target.value }))} /> setForm((prev) => ({ ...prev, headers: entries }))} addLabel={t('common.custom_headers_add')} keyPlaceholder={t('common.custom_headers_key_placeholder')} valuePlaceholder={t('common.custom_headers_value_placeholder')} />