mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2024-09-22 20:26:33 +02:00
88 lines
2.5 KiB
JavaScript
88 lines
2.5 KiB
JavaScript
import { useState, useEffect } from "react";
|
|
import ChatHistory from "./ChatHistory";
|
|
import PromptInput from "./PromptInput";
|
|
import Workspace from "../../../models/workspace";
|
|
import handleChat from "../../../utils/chat";
|
|
|
|
export default function ChatContainer({ workspace, knownHistory = [] }) {
|
|
const [message, setMessage] = useState("");
|
|
const [loadingResponse, setLoadingResponse] = useState(false);
|
|
const [chatHistory, setChatHistory] = useState(knownHistory);
|
|
|
|
const handleMessageChange = (event) => {
|
|
setMessage(event.target.value);
|
|
};
|
|
|
|
const handleSubmit = async (event) => {
|
|
event.preventDefault();
|
|
if (!message || message === "") return false;
|
|
|
|
const prevChatHistory = [
|
|
...chatHistory,
|
|
{ content: message, role: "user" },
|
|
{
|
|
content: "",
|
|
role: "assistant",
|
|
pending: true,
|
|
userMessage: message,
|
|
animate: true,
|
|
},
|
|
];
|
|
|
|
setChatHistory(prevChatHistory);
|
|
setMessage("");
|
|
setLoadingResponse(true);
|
|
};
|
|
|
|
useEffect(() => {
|
|
async function fetchReply() {
|
|
const promptMessage =
|
|
chatHistory.length > 0 ? chatHistory[chatHistory.length - 1] : null;
|
|
const remHistory = chatHistory.length > 0 ? chatHistory.slice(0, -1) : [];
|
|
var _chatHistory = [...remHistory];
|
|
|
|
if (!promptMessage || !promptMessage?.userMessage) {
|
|
setLoadingResponse(false);
|
|
return false;
|
|
}
|
|
|
|
const chatResult = await Workspace.sendChat(
|
|
workspace,
|
|
promptMessage.userMessage
|
|
);
|
|
if (!chatResult) {
|
|
alert("Could not send chat.");
|
|
setLoadingResponse(false);
|
|
return;
|
|
}
|
|
handleChat(
|
|
chatResult,
|
|
setLoadingResponse,
|
|
setChatHistory,
|
|
remHistory,
|
|
_chatHistory
|
|
);
|
|
}
|
|
loadingResponse === true && fetchReply();
|
|
}, [loadingResponse, chatHistory, workspace]);
|
|
|
|
return (
|
|
<div
|
|
style={{ height: "calc(100% - 32px)" }}
|
|
className="transition-all duration-500 relative ml-[2px] mr-[8px] my-[16px] rounded-[26px] bg-white dark:bg-black-900 min-w-[82%] p-[18px] h-full overflow-y-scroll"
|
|
>
|
|
<div className="flex flex-col h-full w-full flex">
|
|
<ChatHistory history={chatHistory} workspace={workspace} />
|
|
<PromptInput
|
|
workspace={workspace}
|
|
message={message}
|
|
submit={handleSubmit}
|
|
onChange={handleMessageChange}
|
|
inputDisabled={loadingResponse}
|
|
buttonDisabled={loadingResponse}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|