diff --git a/frontend-web/src/pages/IframeChatPage.tsx b/frontend-web/src/pages/IframeChatPage.tsx index 36d4cc2a..79f37082 100644 --- a/frontend-web/src/pages/IframeChatPage.tsx +++ b/frontend-web/src/pages/IframeChatPage.tsx @@ -1,7 +1,7 @@ "use client"; import { useRouter } from "next/navigation"; -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { type PromptInputMessage } from "@/components/ai-elements/prompt-input"; import { useArtifacts } from "@/components/workspace/artifacts"; @@ -46,6 +46,22 @@ type BrainyChatSubmitMessage = { requestId?: string; }; +type BrainyChatStatus = "started" | "finished"; + +function postBrainyChatStatus(status: BrainyChatStatus, requestId: string) { + window.parent?.postMessage( + { + source: "brainy-iframe", + type: "brainy:chat-status", + payload: { + status, + requestId, + }, + }, + "*", + ); +} + function buildIframeMessageText({ text, prompt, @@ -101,6 +117,7 @@ export default function IframeChatPage() { const { data: promptPrefixSettings } = usePromptPrefixSettings(); const [promptPrefixOn, setPromptPrefixOn] = useState(false); const [selectedAgentId, setSelectedAgentId] = useState(null); + const pendingRequestIdRef = useRef(null); const { selectedArtifact } = useArtifacts(); useSpecificChatMode(); @@ -130,8 +147,17 @@ export default function IframeChatPage() { "", `${window.location.pathname}${window.location.search}#${routeBase}/chats_iframe/${createdThreadId}`, ); + + if (pendingRequestIdRef.current) { + postBrainyChatStatus("started", pendingRequestIdRef.current); + } }, onFinish: (state) => { + if (pendingRequestIdRef.current) { + postBrainyChatStatus("finished", pendingRequestIdRef.current); + pendingRequestIdRef.current = null; + } + if (document.hidden || !document.hasFocus()) { let body = "Conversation finished"; const lastMessage = state.messages.at(-1); @@ -266,6 +292,8 @@ export default function IframeChatPage() { if (!submitText) return; + pendingRequestIdRef.current = data.requestId ?? null; + const iframeContext: Record = {}; if (data.requestId) { iframeContext.brainy_request_id = data.requestId;