| import { useQueries, useQuery } from "@tanstack/react-query"; | |
| import axios from "axios"; | |
| import React from "react"; | |
| import { useSelector } from "react-redux"; | |
| import { openHands } from "#/api/open-hands-axios"; | |
| import { RUNTIME_INACTIVE_STATES } from "#/types/agent-state"; | |
| import { RootState } from "#/store"; | |
| import { useConversation } from "#/context/conversation-context"; | |
| export const useActiveHost = () => { | |
| const { curAgentState } = useSelector((state: RootState) => state.agent); | |
| const [activeHost, setActiveHost] = React.useState<string | null>(null); | |
| const { conversationId } = useConversation(); | |
| const { data } = useQuery({ | |
| queryKey: [conversationId, "hosts"], | |
| queryFn: async () => { | |
| const response = await openHands.get<{ hosts: string[] }>( | |
| `/api/conversations/${conversationId}/web-hosts`, | |
| ); | |
| return { hosts: Object.keys(response.data.hosts) }; | |
| }, | |
| enabled: !RUNTIME_INACTIVE_STATES.includes(curAgentState), | |
| initialData: { hosts: [] }, | |
| }); | |
| const apps = useQueries({ | |
| queries: data.hosts.map((host) => ({ | |
| queryKey: [conversationId, "hosts", host], | |
| queryFn: async () => { | |
| try { | |
| await axios.get(host); | |
| return host; | |
| } catch (e) { | |
| return ""; | |
| } | |
| }, | |
| refetchInterval: 3000, | |
| })), | |
| }); | |
| const appsData = apps.map((app) => app.data); | |
| React.useEffect(() => { | |
| const successfulApp = appsData.find((app) => app); | |
| setActiveHost(successfulApp || ""); | |
| }, [appsData]); | |
| return { activeHost }; | |
| }; | |