Spaces:
Running
Running
"use client"; | |
import { useState } from "react"; | |
import ChatMessage from "./ChatMessage"; | |
import FileUpload from "./FileUpload"; | |
interface Message { | |
type: "user" | "assistant"; | |
content: string; | |
} | |
export default function Chat() { | |
const [messages, setMessages] = useState<Message[]>([]); | |
const [input, setInput] = useState(""); | |
const [isLoading, setIsLoading] = useState(false); | |
const [hasUploadedFile, setHasUploadedFile] = useState(false); | |
const handleSubmit = async (e: React.FormEvent) => { | |
e.preventDefault(); | |
if (!input.trim() || isLoading) return; | |
const userMessage = input.trim(); | |
setInput(""); | |
setMessages((prev) => [...prev, { type: "user", content: userMessage }]); | |
setIsLoading(true); | |
try { | |
const response = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/ask`, { | |
method: "POST", | |
headers: { "Content-Type": "application/json" }, | |
body: JSON.stringify({ text: userMessage }), | |
}); | |
const data = await response.json(); | |
setMessages((prev) => [ | |
...prev, | |
{ type: "assistant", content: data.answer }, | |
]); | |
} catch (error) { | |
console.error("Error:", error); | |
setMessages((prev) => [ | |
...prev, | |
{ | |
type: "assistant", | |
content: "Sorry, there was an error processing your request.", | |
}, | |
]); | |
} finally { | |
setIsLoading(false); | |
} | |
}; | |
return ( | |
<div className="w-full max-w-4xl mx-auto h-[80vh] flex flex-col"> | |
{!hasUploadedFile ? ( | |
<FileUpload onUploadSuccess={() => setHasUploadedFile(true)} /> | |
) : ( | |
<> | |
<div className="flex-1 overflow-y-auto p-4 space-y-4"> | |
{messages.map((message, index) => ( | |
<ChatMessage | |
key={index} | |
type={message.type} | |
content={message.content} | |
/> | |
))} | |
{isLoading && ( | |
<div className="text-center text-gray-500">Loading...</div> | |
)} | |
</div> | |
<form onSubmit={handleSubmit} className="p-4 border-t"> | |
<div className="flex gap-2"> | |
<input | |
type="text" | |
value={input} | |
onChange={(e) => setInput(e.target.value)} | |
placeholder="Ask a question about your PDF..." | |
className="flex-1 p-2 border rounded-lg dark:bg-gray-800" | |
disabled={isLoading} | |
/> | |
<button | |
type="submit" | |
disabled={isLoading} | |
className="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 disabled:opacity-50" | |
> | |
Send | |
</button> | |
</div> | |
</form> | |
</> | |
)} | |
</div> | |
); | |
} | |