Spaces:
Runtime error
Runtime error
| import { useEffect, useRef, useState } from "react"; | |
| import io from "socket.io-client"; | |
| import { v4 as uuidv4 } from "uuid"; | |
| import InitialLoader from "../components/InitialLoader"; | |
| import Input from "../components/Input"; | |
| import Messages from "../components/Messages"; | |
| import { useMessageFetching } from "../context/MessageFetch"; | |
| import { MessageType } from "../types/types"; | |
| const socket = io("http://localhost:8889"); | |
| export default function Main() { | |
| const [input, setInput] = useState<string>(""); | |
| const [response, setResponse] = useState(""); | |
| const { | |
| setMessageFetching, | |
| messages, | |
| setMessages, | |
| disableinput, | |
| setDisableinput, | |
| setFetchedMessages, | |
| messageFetching, | |
| } = useMessageFetching(); | |
| const inputRef = useRef<HTMLDivElement>(null); | |
| function addMessage(msg: MessageType) { | |
| if (msg.user) { | |
| setMessages( | |
| // @ts-ignore | |
| (prev) => [...prev, msg] | |
| ); | |
| } else { | |
| // @ts-ignore | |
| setMessages((prev) => [...prev, msg]); | |
| } | |
| } | |
| useEffect(() => { | |
| if (inputRef.current) { | |
| inputRef.current.focus(); | |
| } | |
| }, [inputRef.current, disableinput]); | |
| useEffect(() => { | |
| socket.on("response", (data) => { | |
| const result = data.output; | |
| const justText = result.replace( | |
| // eslint-disable-next-line no-control-regex | |
| /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, | |
| "" | |
| ); | |
| if (messages.length > 0) { | |
| setResponse((prevResponse) => prevResponse + justText); | |
| if (messageFetching) { | |
| setFetchedMessages(response); | |
| // @ts-ignore | |
| setMessages((prev) => { | |
| prev[prev.length - 1].message = response; | |
| return [...prev]; | |
| }); | |
| } | |
| // console.log(JSON.stringify(response)); | |
| } | |
| // if no data is returned console log the message complete | |
| if (result === "\n>") { | |
| console.log("message complete"); | |
| } | |
| }); | |
| socket.on("chatend", () => { | |
| socket.emit("chatstart"); | |
| setDisableinput(false); | |
| setMessageFetching(false); | |
| }); | |
| return () => { | |
| socket.off("response"); | |
| socket.off("chatend"); | |
| }; | |
| }, [messages]); | |
| const askQuestion = (message: string) => { | |
| const senderID = uuidv4(); | |
| const replyID = uuidv4(); | |
| setResponse(""); | |
| addMessage({ | |
| message: message, | |
| user: true, | |
| id: senderID, | |
| }); | |
| socket.emit("message", message); | |
| addMessage({ | |
| message: "", | |
| user: false, | |
| id: replyID, | |
| replyId: senderID, | |
| }); | |
| }; | |
| return ( | |
| <div> | |
| <div | |
| className="main_container" | |
| style={{ | |
| width: "100%", | |
| margin: "auto", | |
| height: "100vh", | |
| position: "relative", | |
| overflowY: "hidden", | |
| }} | |
| > | |
| {messages.length != 0 ? ( | |
| <div | |
| style={{ | |
| height: "88%", | |
| overflowY: "scroll", | |
| width: "100%", | |
| justifyContent: "center", | |
| display: "flex", | |
| }} | |
| > | |
| <div | |
| style={{ | |
| width: "100%", | |
| paddingTop: "10px", | |
| }} | |
| > | |
| <Messages messages={messages} /> | |
| </div> | |
| </div> | |
| ) : ( | |
| <div | |
| style={{ | |
| width: "100%", | |
| justifyContent: "center", | |
| alignItems: "center", | |
| display: "flex", | |
| }} | |
| > | |
| <div | |
| style={{ | |
| width: "100%", | |
| }} | |
| className="initial_loader_wrapper" | |
| > | |
| <InitialLoader setInput={setInput} inputRef={inputRef} /> | |
| </div> | |
| </div> | |
| )} | |
| <div | |
| style={{ | |
| justifyContent: "center", | |
| alignItems: "center", | |
| display: "flex", | |
| }} | |
| > | |
| <Input | |
| askQuestion={askQuestion} | |
| input={input} | |
| setInput={setInput} | |
| inputRef={inputRef} | |
| socket={socket} | |
| /> | |
| </div> | |
| </div> | |
| </div> | |
| ); | |
| } | |