Spaces:
Running
Running
import React, { useState, useEffect } from 'react'; | |
import ResearchForm from '../Task/ResearchForm'; | |
import Report from '../Task/Report'; | |
import AgentLogs from '../Task/AgentLogs'; | |
import AccessReport from '../ResearchBlocks/AccessReport'; | |
interface ChatBoxSettings { | |
report_source: string; | |
report_type: string; | |
tone: string; | |
} | |
interface ChatBoxProps { | |
chatBoxSettings: ChatBoxSettings; | |
setChatBoxSettings: React.Dispatch<React.SetStateAction<ChatBoxSettings>>; | |
} | |
interface OutputData { | |
pdf?: string; | |
docx?: string; | |
json?: string; | |
} | |
interface WebSocketMessage { | |
type: 'logs' | 'report' | 'path'; | |
output: string | OutputData; | |
} | |
export default function ChatBox({ chatBoxSettings, setChatBoxSettings }: ChatBoxProps) { | |
const [agentLogs, setAgentLogs] = useState<any[]>([]); | |
const [report, setReport] = useState(""); | |
const [accessData, setAccessData] = useState({}); | |
const [socket, setSocket] = useState<WebSocket | null>(null); | |
useEffect(() => { | |
if (typeof window !== 'undefined') { | |
const { protocol, pathname } = window.location; | |
let { host } = window.location; | |
host = host.includes('localhost') ? 'localhost:8000' : host; | |
const ws_uri = `${protocol === 'https:' ? 'wss:' : 'ws:'}//${host}${pathname}ws`; | |
const newSocket = new WebSocket(ws_uri); | |
setSocket(newSocket); | |
newSocket.onmessage = (event) => { | |
const data = JSON.parse(event.data) as WebSocketMessage; | |
if (data.type === 'logs') { | |
setAgentLogs((prevLogs: any[]) => [...prevLogs, data]); | |
} else if (data.type === 'report') { | |
setReport((prevReport: string) => prevReport + (data.output as string)); | |
} else if (data.type === 'path') { | |
const output = data.output as OutputData; | |
setAccessData({ | |
...(output.pdf && { pdf: `outputs/${output.pdf}` }), | |
...(output.docx && { docx: `outputs/${output.docx}` }), | |
...(output.json && { json: `outputs/${output.json}` }) | |
}); | |
} | |
}; | |
return () => { | |
newSocket.close(); | |
}; | |
} | |
}, []); | |
return ( | |
<div> | |
<main className="container" id="form"> | |
<ResearchForm | |
chatBoxSettings={chatBoxSettings} | |
setChatBoxSettings={setChatBoxSettings} | |
/> | |
{agentLogs?.length > 0 ? <AgentLogs agentLogs={agentLogs} /> : ''} | |
<div className="margin-div"> | |
{report ? <Report report={report} /> : ''} | |
{Object.keys(accessData).length > 0 && | |
<AccessReport | |
accessData={accessData} | |
chatBoxSettings={chatBoxSettings} | |
report={report} | |
/> | |
} | |
</div> | |
</main> | |
</div> | |
); | |
} |