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