// src/components/ProviderDropdown.js import React, { useState, useRef, useEffect } from 'react'; import { ChevronDown, Cpu, Cloud, Server, Loader2 } from 'lucide-react'; import { useTheme } from '../contexts/ThemeContext'; const ProviderDropdown = ({ currentProvider, onProviderChange, isLoading = false }) => { const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); const { isDark } = useTheme(); const providers = [ { id: 'gemini', name: 'Gemini', description: 'Google\'s Gemini AI', icon: Cloud, badge: 'Cloud' }, { id: 'ollama', name: 'Ollama', description: 'Local LLM via Ollama', icon: Cpu, badge: 'Local' }, { id: 'vllm', name: 'vLLM', description: 'vLLM inference endpoint', icon: Server, badge: 'API' } ]; const currentProviderInfo = providers.find(p => p.id === currentProvider); // Close dropdown when clicking outside useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const handleProviderSelect = (providerId) => { if (providerId !== currentProvider && !isLoading) { onProviderChange(providerId); setIsOpen(false); } }; const toggleDropdown = () => { if (!isLoading) { setIsOpen(!isOpen); } }; return (
{isOpen && (
{providers.map((provider) => { const Icon = provider.icon; const isSelected = provider.id === currentProvider; return ( ); })}
)}
); }; export default ProviderDropdown;