openhands / src /hooks /query /use-active-conversation.ts
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
9b906ea verified
Raw History Blame Contribute Delete
1.74 kB
import { useEffect } from "react";
import { useOptionalConversationId } from "#/hooks/use-conversation-id";
import { useUserConversation } from "./use-user-conversation";
import ConversationService from "#/api/conversation-service/conversation-service.api";
import { isExecutionActive } from "#/utils/status";
export const useActiveConversation = () => {
// Optional: the chat input renders on the home page too (no conversation
// route yet). The user-conversation query is gated on a real id below.
const { conversationId } = useOptionalConversationId();
// Task polling is handled by useTaskPolling hook
const isTaskId = !!conversationId && conversationId.startsWith("task-");
const actualConversationId =
!conversationId || isTaskId ? null : conversationId;
const userConversation = useUserConversation(
actualConversationId,
// Fast-poll (3 s) while: the sandbox URL is absent; the sandbox is PAUSED
// (it keeps the stale conversation_url, so a missing-URL check alone misses
// the wake-up); or the agent is executing but has no title yet (the title
// lands asynchronously after conversation_url is already set).
(query) => {
const data = query.state.data;
if (
data &&
(!data.conversation_url ||
data.sandbox_status === "PAUSED" ||
(!data.title && isExecutionActive(data.execution_status)))
) {
return 3000;
}
return 30000;
},
);
useEffect(() => {
const conversation = userConversation.data;
ConversationService.setCurrentConversation(conversation || null);
}, [
conversationId,
userConversation.isFetched,
userConversation?.data?.execution_status,
]);
return userConversation;
};