Skip to main content
Glama
provider-selector.tsx3.48 kB
"use client" import { useState } from "react" import { Check, ChevronsUpDown } from "lucide-react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" import { useLlmProvider } from "@/contexts/llm-provider-context" import type { ProviderType } from "@/lib/types" import { toast } from "sonner" interface ProviderSelectorProps { selectedProvider: ProviderType onProviderChange: (providerId: ProviderType) => void className?: string disabled?: boolean } export function ProviderSelector({ selectedProvider, onProviderChange, className, disabled = false, }: ProviderSelectorProps) { const { providers } = useLlmProvider() const [open, setOpen] = useState(false) const availableProviders = providers.filter((p) => p.isAvailable) const selectedProviderInfo = providers.find((p) => p.id === selectedProvider) const displayName = selectedProviderInfo?.name || "Select provider..." const handleSelectProvider = (value: string) => { const provider = providers.find((p) => p.id === value) if (!provider || !provider.isAvailable) return onProviderChange(value as ProviderType) setOpen(false) toast.success(`Provider changed`, { description: `Now using ${provider.name}`, duration: 3000, }) } return ( <Popover open={open} onOpenChange={setOpen}> <PopoverTrigger asChild> <Button variant="outline" role="combobox" aria-expanded={open} className={cn("w-full justify-between", className)} disabled={disabled} > <span className="truncate">{displayName}</span> <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" /> </Button> </PopoverTrigger> <PopoverContent className="w-full p-0" sideOffset={4}> <Command> <CommandInput placeholder="Search providers..." /> <CommandList> <CommandEmpty>No provider found.</CommandEmpty> <CommandGroup> {availableProviders.map((provider) => ( <div key={provider.id} className="cursor-pointer" onClick={() => handleSelectProvider(provider.id)}> <CommandItem value={provider.id} onSelect={handleSelectProvider} className="hover:bg-accent hover:text-accent-foreground cursor-pointer" > <Check className={cn("mr-2 h-4 w-4", selectedProvider === provider.id ? "opacity-100" : "opacity-0")} /> <div className="flex items-center"> <div className="w-6 h-6 mr-2 rounded-full overflow-hidden bg-muted flex items-center justify-center"> <img src={provider.logoSrc || "/placeholder.svg"} alt={provider.name} className="w-4 h-4 object-contain" /> </div> {provider.name} </div> </CommandItem> </div> ))} </CommandGroup> </CommandList> </Command> </PopoverContent> </Popover> ) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/myeong-ga/research-agent-mcp-0.36-pro-preview-06-01'

If you have feedback or need assistance with the MCP directory API, please join our Discord server