change chat shortcut to ctrl+k and handled websocket errors

This commit is contained in:
anovazzi1 2023-04-27 23:23:14 -03:00
commit e92cf1110a
2 changed files with 116 additions and 80 deletions

View file

@ -14,7 +14,8 @@ export default function Chat({ flow }: ChatType) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
useEffect(() => { useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === "K" && event.shiftKey && (event.metaKey||event.ctrlKey)) { event.preventDefault()
if ((event.key === "K"||event.key==="k") && (event.metaKey||event.ctrlKey)) {
setOpen(oldState=>!oldState); setOpen(oldState=>!oldState);
} }
}; };

View file

@ -28,7 +28,6 @@ export default function ChatModal({
setOpen: Function; setOpen: Function;
flow: FlowType; flow: FlowType;
}) { }) {
const { updateFlow } = useContext(TabsContext);
const [chatValue, setChatValue] = useState(""); const [chatValue, setChatValue] = useState("");
const [chatHistory, setChatHistory] = useState<ChatMessageType[]>([]); const [chatHistory, setChatHistory] = useState<ChatMessageType[]>([]);
const { reactFlowInstance } = useContext(typesContext); const { reactFlowInstance } = useContext(typesContext);
@ -44,7 +43,7 @@ export default function ChatModal({
setChatHistory((old) => { setChatHistory((old) => {
let newChat = _.cloneDeep(old); let newChat = _.cloneDeep(old);
if (files) { if (files) {
newChat.push({ message, isSend, files,thought }); newChat.push({ message, isSend, files, thought });
} else if (thought) { } else if (thought) {
newChat.push({ message, isSend, thought }); newChat.push({ message, isSend, thought });
} else { } else {
@ -55,95 +54,128 @@ export default function ChatModal({
}; };
function connectWS() { function connectWS() {
const newWs = new WebSocket(`ws://127.0.0.1:5003/chat/${flow.id}`); console.log("conectou");
newWs.onopen = () => { try {
console.log("WebSocket connection established!"); const newWs = new WebSocket(`ws://127.0.0.1:5003/chat/${flow.id}`);
}; newWs.onopen = () => {
newWs.onmessage = (event) => { console.log("WebSocket connection established!");
try { };
setLockChat(false); newWs.onmessage = (event) => {
const data = JSON.parse(event.data); try {
console.log("Received data:", data); setLockChat(false);
//get chat history const data = JSON.parse(event.data);
if (Array.isArray(data)) { console.log("Received data:", data);
console.log(data); //get chat history
if (Array.isArray(data)) {
console.log(data);
setChatHistory((_) => { setChatHistory((_) => {
let newChatHistory: ChatMessageType[] = []; let newChatHistory: ChatMessageType[] = [];
data.forEach( data.forEach(
(chatItem: { (chatItem: {
intermediate_steps?: "string"; intermediate_steps?: "string";
is_bot: boolean; is_bot: boolean;
message: string; message: string;
type: string; type: string;
files?: Array<any>; files?: Array<any>;
}) => { }) => {
if (chatItem.message) { if (chatItem.message) {
newChatHistory.push( newChatHistory.push(
chatItem.files chatItem.files
? { ? {
isSend: !chatItem.is_bot, isSend: !chatItem.is_bot,
message: chatItem.message, message: chatItem.message,
thought: chatItem.intermediate_steps, thought: chatItem.intermediate_steps,
files: chatItem.files, files: chatItem.files,
} }
: { : {
isSend: !chatItem.is_bot, isSend: !chatItem.is_bot,
message: chatItem.message, message: chatItem.message,
thought: chatItem.intermediate_steps, thought: chatItem.intermediate_steps,
} }
); );
}
} }
} );
); return newChatHistory;
return newChatHistory; });
}); }
} if (data.type === "end") {
if (data.type === "end") { if (data.files) {
if (data.files) { addChatHistory(
addChatHistory( data.message,
data.message, false,
false, data.intermediate_steps,
data.intermediate_steps, data.files
data.files );
); } else {
} else { addChatHistory(data.message, false, data.intermediate_steps);
addChatHistory(data.message, false, data.intermediate_steps); }
}
if (data.type == "file") {
console.log(data);
}
} catch (error) {
if (event.data !== "Error: 1005") {
setErrorData({ title: event.data });
newWs.close()
connectWS()
} }
} }
if (data.type == "file") { };
console.log(data); newWs.onclose = (_) => {
} if (open) {
} catch (error) { setLockChat(false);
if(event.data!=="Error: 1005"){ setTimeout(() => {
setErrorData({ title: event.data }); connectWS();
}, 1000);
} }
};
newWs.onerror= (ev)=>{
console.log(ev,"error")
} }
}; setWs(newWs);
newWs.onclose = (_) => {
if (open) {
setLockChat(false);
setTimeout(() => {
connectWS();
}, 100);
}
};
setWs(newWs);
return newWs; return newWs;
} catch {
setErrorData({
title: "There was an error on web connection, please: ",
list: [
"refresh the page",
"use a new flow tab",
"check if the backend is up",
],
});
}
} }
useEffect(() => { useEffect(() => {
let newWs = connectWS(); if (ws && (ws.readyState === ws.CLOSED|| ws.readyState===ws.CLOSING)) {
return () => { let newWs = connectWS();
newWs.close(); return () => {
}; console.log("trigger")
newWs.close();
};
}
}, [lockChat]);
useEffect(() => {
let newWs = connectWS();
return () => {
console.log("trigger")
newWs.close();
}
}, []); }, []);
async function sendAll(data: sendAllProps) { async function sendAll(data: sendAllProps) {
if (ws) { try {
ws.send(JSON.stringify(data)); if (ws) {
ws.send(JSON.stringify(data));
}
} catch (error) {
setErrorData({title:"There was an erro sending the message",list:[error.message]})
setChatValue(data.message)
connectWS();
} }
} }
@ -294,7 +326,10 @@ export default function ChatModal({
) : ( ) : (
<div className="flex flex-col h-full text-center justify-center w-full items-center align-middle "> <div className="flex flex-col h-full text-center justify-center w-full items-center align-middle ">
<span> <span>
👋 <span className="text-gray-600 text-lg">LangFlow Chat</span> 👋{" "}
<span className="text-gray-600 text-lg">
LangFlow Chat
</span>
</span> </span>
<br /> <br />
<div className="bg-gray-100 rounded-md w-2/4 px-6 py-8 border border-gray-200"> <div className="bg-gray-100 rounded-md w-2/4 px-6 py-8 border border-gray-200">