"use client"; import { useAtom, useAtomValue } from "jotai"; import { Bot, Check, ChevronDown, Crown, Zap } from "lucide-react"; import { useState } from "react"; import { selectedSystemModelIdAtom, systemModelsAtom, } from "@/atoms/new-llm-config/system-models-query.atoms"; import { Badge } from "@/components/ui/badge"; 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 { Spinner } from "@/components/ui/spinner"; import type { SystemModelItem } from "@/contracts/types/new-llm-config.types"; import { cn } from "@/lib/utils"; interface SystemModelSelectorProps { className?: string; } const TIER_CONFIG: Record; variant: "default" | "secondary" | "outline" }> = { free: { label: "Free", icon: Zap, variant: "secondary" }, pro: { label: "Pro", icon: Crown, variant: "default" }, enterprise: { label: "Enterprise", icon: Crown, variant: "default" }, }; function TierBadge({ tier }: { tier: string }) { const config = TIER_CONFIG[tier.toLowerCase()] ?? { label: tier, icon: Zap, variant: "outline" as const }; const Icon = config.icon; return ( {config.label} ); } export function SystemModelSelector({ className }: SystemModelSelectorProps) { const [open, setOpen] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const { data: models, isPending } = useAtomValue(systemModelsAtom); const [selectedId, setSelectedId] = useAtom(selectedSystemModelIdAtom); const selectedModel: SystemModelItem | undefined = selectedId != null ? models?.find((m) => m.id === selectedId) : undefined; // Use first model as implicit default when nothing selected; guard empty array const displayModel = selectedModel ?? (models && models.length > 0 ? models[0] : undefined); // Auto-select the first model so the ID is available for API calls const effectiveId = selectedId ?? displayModel?.id ?? null; const filteredModels = models?.filter( (m) => !searchQuery || m.name.toLowerCase().includes(searchQuery.toLowerCase()) || m.provider.toLowerCase().includes(searchQuery.toLowerCase()) || m.model_name.toLowerCase().includes(searchQuery.toLowerCase()) ) ?? []; function handleSelect(model: SystemModelItem) { setSelectedId(model.id); setOpen(false); setSearchQuery(""); } return ( {isPending ? (
) : filteredModels.length === 0 ? ( No models found. ) : ( {filteredModels.map((model) => { const isSelected = selectedId === model.id || (selectedId === null && displayModel?.id === model.id); return ( handleSelect(model)} className="flex items-center gap-2 cursor-pointer" >
{model.name} {model.model_name}
); })}
)}
); }