"use client"; import * as React from "react"; import { Plus, Send } from "lucide-react"; import Link from "next/link"; import { Button } from "@/components/ui/button"; import { CardContent, CardFooter } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { AgentMessage } from "@/components/full-screen-chat/agent-message"; import { UserMessage } from "@/components/full-screen-chat/user-message"; interface ChatProps { sessionId: string; query?: string; } interface ChatMessage { role: "user" | "agent"; content: string; } export function FullScreenChat({ sessionId, query }: ChatProps) { const [messages, setMessages] = React.useState([]); React.useEffect(() => { if (query && sessionId) { sendQuery(query, sessionId); } }, [query, sessionId]); const sendQuery = async (query: string, sessionId: string) => { try { setMessages((prevMessages) => [ ...prevMessages, { role: "user", content: query, }, ]); const response = await fetch( `/api/v1/chat?query=${query}&session_id=${sessionId}`, ); if (response.ok) { const reader = response.body.getReader(); // Function to wait for a state update const waitForUpdate = (updateFn) => new Promise((resolve) => { updateFn(); setTimeout(resolve, 0); // Use setTimeout to wait for the next event loop tick }); const processStream = async () => { while (true) { const { done, value } = await reader.read(); if (done) { console.log("stream completed"); break; } const chunk = new TextDecoder("utf-8").decode(value); // Wait for each update to be "processed" await waitForUpdate(() => setMessages((prevMessages) => { const lastMessage = prevMessages[prevMessages.length - 1]; if (lastMessage && lastMessage.role === "agent") { // Append chunk to the last agent message return prevMessages.map((msg, idx) => idx === prevMessages.length - 1 ? { ...msg, content: msg.content + chunk } : msg, ); } else { // Or add a new agent message return [...prevMessages, { role: "agent", content: chunk }]; } }), ); } }; await processStream(); } } catch (error) { console.error( "Error getting response from bot. Please try again.", error, ); setMessages((prevMessages) => [ ...prevMessages, { role: "agent", content: "Error getting response from bot. Please try again.", }, ]); } }; return ( <>
{messages.map((message, index) => message.role === "user" ? ( ) : ( ), )}
{ event.preventDefault(); const currentMessage = event.currentTarget.message.value; event.target.message.value = ""; if (currentMessage === "") { return; } await sendQuery(currentMessage, sessionId); }} className="flex w-full items-center space-x-2" >
Add data
); }