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