import { v4 } from "uuid"; import { safeJsonParse } from "../request"; import { saveAs } from "file-saver"; import { API_BASE } from "../constants"; import { useEffect, useState } from "react"; export const AGENT_SESSION_START = "agentSessionStart"; export const AGENT_SESSION_END = "agentSessionEnd"; const handledEvents = [ "statusResponse", "fileDownload", "awaitingFeedback", "wssFailure", "rechartVisualize", ]; export function websocketURI() { const wsProtocol = window.location.protocol === "https:" ? "wss:" : "ws:"; if (API_BASE === "/api") return `${wsProtocol}//${window.location.host}`; return `${wsProtocol}//${new URL(import.meta.env.VITE_API_BASE).host}`; } export default function handleSocketResponse(event, setChatHistory) { const data = safeJsonParse(event.data, null); if (data === null) return; // No message type is defined then this is a generic message // that we need to print to the user as a system response if (!data.hasOwnProperty("type")) { return setChatHistory((prev) => { return [ ...prev.filter((msg) => !!msg.content), { uuid: v4(), content: data.content, role: "assistant", sources: [], closed: true, error: null, animate: false, pending: false, }, ]; }); } if (!handledEvents.includes(data.type) || !data.content) return; if (data.type === "fileDownload") { saveAs(data.content.b64Content, data.content.filename ?? "unknown.txt"); return; } if (data.type === "rechartVisualize") { return setChatHistory((prev) => { return [ ...prev.filter((msg) => !!msg.content), { type: "rechartVisualize", uuid: v4(), content: data.content, role: "assistant", sources: [], closed: true, error: null, animate: false, pending: false, }, ]; }); } if (data.type === "wssFailure") { return setChatHistory((prev) => { return [ ...prev.filter((msg) => !!msg.content), { uuid: v4(), content: data.content, role: "assistant", sources: [], closed: true, error: data.content, animate: false, pending: false, }, ]; }); } return setChatHistory((prev) => { return [ ...prev.filter((msg) => !!msg.content), { uuid: v4(), type: data.type, content: data.content, role: "assistant", sources: [], closed: true, error: null, animate: data?.animate || false, pending: false, }, ]; }); } export function useIsAgentSessionActive() { const [activeSession, setActiveSession] = useState(false); useEffect(() => { function listenForAgentSession() { if (!window) return; window.addEventListener(AGENT_SESSION_START, () => setActiveSession(true) ); window.addEventListener(AGENT_SESSION_END, () => setActiveSession(false)); } listenForAgentSession(); }, []); return activeSession; }