import React, {useState} from 'react'; import './App.css'; import {fetchEventSource} from "@microsoft/fetch-event-source"; interface Message { message: string; isUser: boolean; sources?: string[]; } function App() { const [inputValue, setInputValue] = useState("") const [messages, setMessages] = useState([]); const setPartialMessage = (chunk: string, sources: string[] = []) => { setMessages(prevMessages => { let lastMessage = prevMessages[prevMessages.length - 1]; if (prevMessages.length === 0 || !lastMessage.isUser) { return [...prevMessages.slice(0, -1), { message: lastMessage.message + chunk, isUser: false, sources: lastMessage.sources ? [...lastMessage.sources, ...sources] : sources }]; } return [...prevMessages, {message: chunk, isUser: false, sources}]; }) } function handleReceiveMessage(data: string) { let parsedData = JSON.parse(data); if (parsedData.answer) { setPartialMessage(parsedData.answer.content) } if (parsedData.docs) { setPartialMessage("", parsedData.docs.map((doc: any) => doc.metadata.source)) } } const handleSendMessage = async (message: string) => { setInputValue("") setMessages(prevMessages => [...prevMessages, {message, isUser: true}]); await fetchEventSource(`${process.env.REACT_APP_BACKEND_URL}/rag/stream`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ input: { question: message, } }), onmessage(event) { if (event.event === "data") { handleReceiveMessage(event.data); } }, }) } const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === "Enter" && !event.shiftKey) { handleSendMessage(inputValue.trim()) } } function formatSource(source: string) { return source.split("/").pop() || ""; } return (
Epic v. Apple Legal Assistant
{messages.map((msg, index) => (
{msg.message} {/* Source */} {!msg.isUser && (

{msg.sources?.map((source, index) => ( ))}
)}
))}
); } export default App;