|
import { useCallback } from 'react' |
|
import { toast } from 'sonner' |
|
|
|
import { useStore } from '../store' |
|
|
|
import { AgentDetails, TeamDetails, type ChatMessage } from '@/types/os' |
|
import { getAgentsAPI, getStatusAPI, getTeamsAPI } from '@/api/os' |
|
import { useQueryState } from 'nuqs' |
|
|
|
const useChatActions = () => { |
|
const { chatInputRef } = useStore() |
|
const selectedEndpoint = useStore((state) => state.selectedEndpoint) |
|
const [, setSessionId] = useQueryState('session') |
|
const setMessages = useStore((state) => state.setMessages) |
|
const setIsEndpointActive = useStore((state) => state.setIsEndpointActive) |
|
const setIsEndpointLoading = useStore((state) => state.setIsEndpointLoading) |
|
const setAgents = useStore((state) => state.setAgents) |
|
const setTeams = useStore((state) => state.setTeams) |
|
const setSelectedModel = useStore((state) => state.setSelectedModel) |
|
const setMode = useStore((state) => state.setMode) |
|
const [agentId, setAgentId] = useQueryState('agent') |
|
const [teamId, setTeamId] = useQueryState('team') |
|
const [, setDbId] = useQueryState('db_id') |
|
|
|
const getStatus = useCallback(async () => { |
|
try { |
|
const status = await getStatusAPI(selectedEndpoint) |
|
return status |
|
} catch { |
|
return 503 |
|
} |
|
}, [selectedEndpoint]) |
|
|
|
const getAgents = useCallback(async () => { |
|
try { |
|
const agents = await getAgentsAPI(selectedEndpoint) |
|
return agents |
|
} catch { |
|
toast.error('Error fetching agents') |
|
return [] |
|
} |
|
}, [selectedEndpoint]) |
|
|
|
const getTeams = useCallback(async () => { |
|
try { |
|
const teams = await getTeamsAPI(selectedEndpoint) |
|
return teams |
|
} catch { |
|
toast.error('Error fetching teams') |
|
return [] |
|
} |
|
}, [selectedEndpoint]) |
|
|
|
const clearChat = useCallback(() => { |
|
setMessages([]) |
|
setSessionId(null) |
|
|
|
}, []) |
|
|
|
const focusChatInput = useCallback(() => { |
|
setTimeout(() => { |
|
requestAnimationFrame(() => chatInputRef?.current?.focus()) |
|
}, 0) |
|
|
|
}, []) |
|
|
|
const addMessage = useCallback( |
|
(message: ChatMessage) => { |
|
setMessages((prevMessages) => [...prevMessages, message]) |
|
}, |
|
[setMessages] |
|
) |
|
|
|
const initialize = useCallback(async () => { |
|
setIsEndpointLoading(true) |
|
try { |
|
const status = await getStatus() |
|
let agents: AgentDetails[] = [] |
|
let teams: TeamDetails[] = [] |
|
if (status === 200) { |
|
setIsEndpointActive(true) |
|
teams = await getTeams() |
|
agents = await getAgents() |
|
console.log(' is active', teams, agents) |
|
|
|
if (!agentId && !teamId) { |
|
const currentMode = useStore.getState().mode |
|
console.log('Current mode:', currentMode) |
|
|
|
if (currentMode === 'team' && teams.length > 0) { |
|
const firstTeam = teams[0] |
|
setTeamId(firstTeam.id) |
|
setSelectedModel(firstTeam.model?.provider || '') |
|
setDbId(firstTeam.db_id || '') |
|
setAgentId(null) |
|
setTeams(teams) |
|
} else if (currentMode === 'agent' && agents.length > 0) { |
|
const firstAgent = agents[0] |
|
setMode('agent') |
|
setAgentId(firstAgent.id) |
|
setSelectedModel(firstAgent.model?.model || '') |
|
setDbId(firstAgent.db_id || '') |
|
setAgents(agents) |
|
} |
|
} else { |
|
setAgents(agents) |
|
setTeams(teams) |
|
if (agentId) { |
|
const agent = agents.find((a) => a.id === agentId) |
|
if (agent) { |
|
setMode('agent') |
|
setSelectedModel(agent.model?.model || '') |
|
setDbId(agent.db_id || '') |
|
setTeamId(null) |
|
} else if (agents.length > 0) { |
|
const firstAgent = agents[0] |
|
setMode('agent') |
|
setAgentId(firstAgent.id) |
|
setSelectedModel(firstAgent.model?.model || '') |
|
setDbId(firstAgent.db_id || '') |
|
setTeamId(null) |
|
} |
|
} else if (teamId) { |
|
const team = teams.find((t) => t.id === teamId) |
|
if (team) { |
|
setMode('team') |
|
setSelectedModel(team.model?.provider || '') |
|
setDbId(team.db_id || '') |
|
setAgentId(null) |
|
} else if (teams.length > 0) { |
|
const firstTeam = teams[0] |
|
setMode('team') |
|
setTeamId(firstTeam.id) |
|
setSelectedModel(firstTeam.model?.provider || '') |
|
setDbId(firstTeam.db_id || '') |
|
setAgentId(null) |
|
} |
|
} |
|
} |
|
} else { |
|
setIsEndpointActive(false) |
|
setMode('agent') |
|
setSelectedModel('') |
|
setAgentId(null) |
|
setTeamId(null) |
|
} |
|
return { agents, teams } |
|
} catch (error) { |
|
console.error('Error initializing :', error) |
|
setIsEndpointActive(false) |
|
setMode('agent') |
|
setSelectedModel('') |
|
setAgentId(null) |
|
setTeamId(null) |
|
setAgents([]) |
|
setTeams([]) |
|
} finally { |
|
setIsEndpointLoading(false) |
|
} |
|
}, [ |
|
getStatus, |
|
getAgents, |
|
getTeams, |
|
setIsEndpointActive, |
|
setIsEndpointLoading, |
|
setAgents, |
|
setTeams, |
|
setAgentId, |
|
setSelectedModel, |
|
setMode, |
|
setTeamId, |
|
setDbId, |
|
agentId, |
|
teamId |
|
]) |
|
|
|
return { |
|
clearChat, |
|
addMessage, |
|
getAgents, |
|
focusChatInput, |
|
getTeams, |
|
initialize |
|
} |
|
} |
|
|
|
export default useChatActions |
|
|