import React, { useState, useEffect } from 'react'; import { motion } from 'framer-motion'; import { X, Key, Eye, EyeOff, Loader2 } from 'lucide-react'; import { useBodyScrollLock } from '../hooks/useBodyScrollLock'; import type { AIProvider, UserPreferences } from '../types'; interface ApiKeyModalProps { isOpen: boolean; onClose: () => void; preferences: UserPreferences; onSave: (prefs: Partial) => Promise; saving: boolean; hasAIAccess: boolean; } export const ApiKeyModal: React.FC = ({ isOpen, onClose, preferences, onSave, saving, hasAIAccess, }) => { useBodyScrollLock(isOpen); const [localProvider, setLocalProvider] = useState(preferences.aiProvider || 'gemini'); const [localGeminiKey, setLocalGeminiKey] = useState(preferences.geminiApiKey || ''); const [localOpenRouterKey, setLocalOpenRouterKey] = useState(preferences.openRouterApiKey || ''); const [localOpenRouterModel, setLocalOpenRouterModel] = useState(preferences.openRouterModel || ''); const [showGeminiKey, setShowGeminiKey] = useState(false); const [showOpenRouterKey, setShowOpenRouterKey] = useState(false); useEffect(() => { if (isOpen) { setLocalProvider(preferences.aiProvider || 'gemini'); setLocalGeminiKey(preferences.geminiApiKey || ''); setLocalOpenRouterKey(preferences.openRouterApiKey || ''); setLocalOpenRouterModel(preferences.openRouterModel || ''); } }, [isOpen, preferences]); if (!isOpen) return null; const handleSave = async () => { await onSave({ aiProvider: localProvider, geminiApiKey: localGeminiKey || undefined, openRouterApiKey: localOpenRouterKey || undefined, openRouterModel: localOpenRouterModel || undefined, }); onClose(); }; return ( e.stopPropagation()} >

AI Settings

Configure your AI provider

{hasAIAccess ? ( <>
{localProvider === 'gemini' ? (

Leave empty to use the system key.

setLocalGeminiKey(e.target.value)} placeholder="AIza..." className="w-full px-4 py-3 pr-12 rounded-xl border-2 border-gray-200 focus:border-theme-primary focus:outline-none text-gray-800" />
) : ( <>

Get your key from{' '} openrouter.ai/keys

setLocalOpenRouterKey(e.target.value)} placeholder="sk-or-..." className="w-full px-4 py-3 pr-12 rounded-xl border-2 border-gray-200 focus:border-theme-primary focus:outline-none text-gray-800" />

Default: google/gemini-3-flash-preview

setLocalOpenRouterModel(e.target.value)} placeholder="google/gemini-3-flash-preview" className="w-full px-4 py-3 rounded-xl border-2 border-gray-200 focus:border-theme-primary focus:outline-none text-gray-800" />
)} ) : (

API access not available

Contact an administrator for access

)}
{hasAIAccess && ( )}
); };