import React, { useState, useEffect, useRef } from 'react' import { ChevronDown, AlertCircle, X } from 'lucide-react' import { availableModels, type Model } from '../types/models' import { hasApiKey, setApiKey, clearApiKey } from '../utils/apiKeys' import ApiKeyModal from './ApiKeyModal' interface ModelSelectorProps { selectedModel: Model onModelChange: (model: Model) => void apiKeyUpdateTrigger: number } const ModelSelector: React.FC = ({ selectedModel, onModelChange, apiKeyUpdateTrigger }) => { const [isOpen, setIsOpen] = useState(false) const [apiKeyModal, setApiKeyModal] = useState<{ isOpen: boolean; model: Model | null }>({ isOpen: false, model: null, }) const [apiKeyStatuses, setApiKeyStatuses] = useState>({}) const dropdownRef = useRef(null) useEffect(() => { const statuses: Record = {} availableModels.forEach((model) => { statuses[model.provider.id] = hasApiKey(model.provider.id) }) setApiKeyStatuses(statuses) }, [apiKeyUpdateTrigger]) useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false) } } if (isOpen) { document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) } }, [isOpen]) const handleModelSelect = (model: Model) => { const hasKey = hasApiKey(model.provider.id) if (!hasKey) { setApiKeyModal({ isOpen: true, model }) } else { onModelChange(model) } setIsOpen(false) } const handleApiKeySave = (apiKey: string) => { if (apiKeyModal.model) { setApiKey(apiKeyModal.model.provider.id, apiKey) setApiKeyStatuses((prev) => ({ ...prev, [apiKeyModal.model!.provider.id]: true })) onModelChange(apiKeyModal.model) } } const handleClearApiKey = (providerId: string, e: React.MouseEvent) => { e.stopPropagation() clearApiKey(providerId) setApiKeyStatuses((prev) => ({ ...prev, [providerId]: false })) } const getApiKeyIcon = (providerId: string) => { const hasKey = apiKeyStatuses[providerId] if (hasKey) { return ( ) } else { return (
) } } return ( <>
{isOpen && (
{availableModels.map((model) => ( ))}
)}
setApiKeyModal({ isOpen: false, model: null })} provider={apiKeyModal.model?.provider ?? { id: '', name: '', baseUrl: '', apiKeyHeader: '', documentationUrl: '' }} onSave={handleApiKeySave} /> ) } export default ModelSelector