| 'use client' |
|
|
| import * as React from 'react' |
| import { |
| Select, |
| SelectTrigger, |
| SelectValue, |
| SelectContent, |
| SelectItem |
| } from '@/components/ui/select' |
| import { usePlaygroundStore } from '@/store' |
| import { useQueryState } from 'nuqs' |
| import Icon from '@/components/ui/icon' |
| import { useEffect } from 'react' |
| import useChatActions from '@/hooks/useChatActions' |
|
|
| export function AgentSelector() { |
| const { agents, setMessages, setSelectedModel, setHasStorage } = |
| usePlaygroundStore() |
| const { focusChatInput } = useChatActions() |
| const [agentId, setAgentId] = useQueryState('agent', { |
| parse: (value) => value || undefined, |
| history: 'push' |
| }) |
| const [, setSessionId] = useQueryState('session') |
|
|
| |
| useEffect(() => { |
| if (agentId && agents.length > 0) { |
| const agent = agents.find((agent) => agent.value === agentId) |
| if (agent) { |
| setSelectedModel(agent.model.provider || '') |
| setHasStorage(!!agent.storage) |
| if (agent.model.provider) { |
| focusChatInput() |
| } |
| } else { |
| setAgentId(agents[0].value) |
| } |
| } |
| |
| }, [agentId, agents, setSelectedModel]) |
|
|
| const handleOnValueChange = (value: string) => { |
| const newAgent = value === agentId ? '' : value |
| const selectedAgent = agents.find((agent) => agent.value === newAgent) |
| setSelectedModel(selectedAgent?.model.provider || '') |
| setHasStorage(!!selectedAgent?.storage) |
| setAgentId(newAgent) |
| setMessages([]) |
| setSessionId(null) |
| if (selectedAgent?.model.provider) { |
| focusChatInput() |
| } |
| } |
|
|
| return ( |
| <Select |
| value={agentId || ''} |
| onValueChange={(value) => handleOnValueChange(value)} |
| > |
| <SelectTrigger className="h-9 w-full rounded-xl border border-primary/15 bg-primaryAccent text-xs font-medium uppercase"> |
| <SelectValue placeholder="Select Agent" /> |
| </SelectTrigger> |
| <SelectContent className="border-none bg-primaryAccent font-dmmono shadow-lg"> |
| {agents.map((agent, index) => ( |
| <SelectItem |
| className="cursor-pointer" |
| key={`${agent.value}-${index}`} |
| value={agent.value} |
| > |
| <div className="flex items-center gap-3 text-xs font-medium uppercase"> |
| <Icon type={'agent'} size="xs" /> |
| {agent.label} |
| </div> |
| </SelectItem> |
| ))} |
| {agents.length === 0 && ( |
| <SelectItem |
| value="no-agents" |
| className="cursor-not-allowed select-none text-center" |
| > |
| No agents found |
| </SelectItem> |
| )} |
| </SelectContent> |
| </Select> |
| ) |
| } |
|
|