File size: 3,174 Bytes
f8b5d42 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
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;
}
|