|
|
'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> |
|
|
) |
|
|
} |
|
|
|