| | 'use client' |
| |
|
| | import * as React from 'react' |
| | import { |
| | Select, |
| | SelectTrigger, |
| | SelectValue, |
| | SelectContent, |
| | SelectItem |
| | } from '@/components/ui/select' |
| | import { useStore } from '@/store' |
| | import { useQueryState } from 'nuqs' |
| | import Icon from '@/components/ui/icon' |
| | import { useEffect } from 'react' |
| | import useChatActions from '@/hooks/useChatActions' |
| |
|
| | export function EntitySelector() { |
| | const { mode, agents, teams, setMessages, setSelectedModel } = useStore() |
| |
|
| | const { focusChatInput } = useChatActions() |
| | const [agentId, setAgentId] = useQueryState('agent', { |
| | parse: (value) => value || undefined, |
| | history: 'push' |
| | }) |
| | const [teamId, setTeamId] = useQueryState('team', { |
| | parse: (value) => value || undefined, |
| | history: 'push' |
| | }) |
| | const [, setSessionId] = useQueryState('session') |
| |
|
| | const currentEntities = mode === 'team' ? teams : agents |
| | const currentValue = mode === 'team' ? teamId : agentId |
| | const placeholder = mode === 'team' ? 'Select Team' : 'Select Agent' |
| |
|
| | useEffect(() => { |
| | if (currentValue && currentEntities.length > 0) { |
| | const entity = currentEntities.find((item) => item.id === currentValue) |
| | if (entity) { |
| | setSelectedModel(entity.model?.model || '') |
| | if (mode === 'team') { |
| | setTeamId(entity.id) |
| | } |
| | if (entity.model?.model) { |
| | focusChatInput() |
| | } |
| | } |
| | } |
| | |
| | }, [currentValue, currentEntities, setSelectedModel, mode]) |
| |
|
| | const handleOnValueChange = (value: string) => { |
| | const newValue = value === currentValue ? null : value |
| | const selectedEntity = currentEntities.find((item) => item.id === newValue) |
| |
|
| | setSelectedModel(selectedEntity?.model?.provider || '') |
| |
|
| | if (mode === 'team') { |
| | setTeamId(newValue) |
| | setAgentId(null) |
| | } else { |
| | setAgentId(newValue) |
| | setTeamId(null) |
| | } |
| |
|
| | setMessages([]) |
| | setSessionId(null) |
| |
|
| | if (selectedEntity?.model?.provider) { |
| | focusChatInput() |
| | } |
| | } |
| |
|
| | if (currentEntities.length === 0) { |
| | return ( |
| | <Select disabled> |
| | <SelectTrigger className="h-9 w-full rounded-xl border border-primary/15 bg-primaryAccent text-xs font-medium uppercase opacity-50"> |
| | <SelectValue placeholder={`No ${mode}s Available`} /> |
| | </SelectTrigger> |
| | </Select> |
| | ) |
| | } |
| |
|
| | return ( |
| | <Select |
| | value={currentValue || ''} |
| | 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={placeholder} /> |
| | </SelectTrigger> |
| | <SelectContent className="border-none bg-primaryAccent font-dmmono shadow-lg"> |
| | {currentEntities.map((entity, index) => ( |
| | <SelectItem |
| | className="cursor-pointer" |
| | key={`${entity.id}-${index}`} |
| | value={entity.id} |
| | > |
| | <div className="flex items-center gap-3 text-xs font-medium uppercase"> |
| | <Icon type={'user'} size="xs" /> |
| | {entity.name || entity.id} |
| | </div> |
| | </SelectItem> |
| | ))} |
| | </SelectContent> |
| | </Select> |
| | ) |
| | } |
| |
|