'use client'; import { startTransition, useMemo, useOptimistic, useState } from 'react'; import { saveChatModelAsCookie } from '@/app/(chat)/actions'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { chatModels } from '@/lib/ai/models'; import { cn } from '@/lib/utils'; import { CheckCircleFillIcon, ChevronDownIcon } from './icons'; export function ModelSelector({ selectedModelId, className, }: { selectedModelId: string; } & React.ComponentProps) { const [open, setOpen] = useState(false); const [optimisticModelId, setOptimisticModelId] = useOptimistic(selectedModelId); const selectedChatModel = useMemo( () => chatModels.find((chatModel) => chatModel.id === optimisticModelId), [optimisticModelId], ); return ( {chatModels.map((chatModel) => { const { id } = chatModel; return ( { setOpen(false); startTransition(() => { setOptimisticModelId(id); saveChatModelAsCookie(id); }); }} data-active={id === optimisticModelId} asChild > ); })} ); }