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(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 }; };