'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); }); }} className="gap-4 group/item flex flex-row justify-between items-center" data-active={id === optimisticModelId} >
{chatModel.name}
{chatModel.description}
); })}
); }