|
1 | | -"use client"; |
| 1 | +"use client" |
2 | 2 |
|
3 | | -import { useState } from "react"; |
| 3 | +import { useState, useEffect } from "react"; |
4 | 4 | import Sidebar from "@/app/components/random_chat_components/Sidebar"; |
5 | | -import Image from "next/image"; |
6 | 5 |
|
7 | 6 | const RandomChat = () => { |
8 | | - const [message, setMessage] = useState<string>(""); |
| 7 | + const [inputMessage, setInputMessage] = useState<string>(""); |
| 8 | + const [chatMessages, setChatMessages] = useState<string[]>([]); |
| 9 | + const [socket, setSocket] = useState<WebSocket | null>(null); |
| 10 | + |
| 11 | + useEffect(() => { |
| 12 | + const newSocket = new WebSocket( |
| 13 | + "ws://3.131.171.245:8181/v1.0/voyager_web_socket/ws" |
| 14 | + ); |
| 15 | + |
| 16 | + newSocket.onopen = () => { |
| 17 | + setSocket(newSocket); |
| 18 | + }; |
| 19 | + |
| 20 | + newSocket.onmessage = (event) => { |
| 21 | + const message = JSON.parse(event.data); |
| 22 | + setChatMessages((prevMessages) => [...prevMessages, message.content]); |
| 23 | + }; |
| 24 | + |
| 25 | + return () => { |
| 26 | + newSocket.close(); |
| 27 | + }; |
| 28 | + }, []); // Only runs once when the component mounts |
| 29 | + |
| 30 | + function sendMessage(event: React.KeyboardEvent<HTMLInputElement>) { |
| 31 | + if ( |
| 32 | + event.key === "Enter" && |
| 33 | + socket && |
| 34 | + socket.readyState === WebSocket.OPEN |
| 35 | + ) { |
| 36 | + // Send the message |
| 37 | + socket.send(JSON.stringify({ content: inputMessage })); |
| 38 | + setInputMessage(""); // Clear input field after sending message |
| 39 | + } else { |
| 40 | + console.error("WebSocket connection is not open."); |
| 41 | + } |
| 42 | + } |
9 | 43 |
|
10 | 44 | const handleMessageChange = (event: React.ChangeEvent<HTMLInputElement>) => { |
11 | | - setMessage(event.target.value); |
12 | | - console.log("Message: ", event.target.value); |
| 45 | + setInputMessage(event.target.value); |
13 | 46 | }; |
14 | 47 |
|
15 | 48 | return ( |
16 | 49 | <div className="flex w-full h-full"> |
17 | 50 | <Sidebar /> |
18 | 51 | <div className="flex h-[100vh] w-full ml-[25%] bg-[#393E46]"> |
| 52 | + <div className="bg-blue text-white p-2"> |
| 53 | + {chatMessages.map((message, index) => ( |
| 54 | + <div key={index}>{message}</div> |
| 55 | + ))} |
| 56 | + </div> |
| 57 | + |
19 | 58 | <div className="w-[90%] self-end mx-auto mb-5"> |
20 | 59 | <input |
21 | 60 | type="text" |
22 | 61 | id="default-input" |
23 | 62 | className="text-gray-50 text-sm rounded-lg block p-2.5 w-full bg-gray-500 outline-none" |
24 | 63 | placeholder="Enter text here..." |
25 | | - value={message} |
| 64 | + value={inputMessage} |
26 | 65 | onChange={handleMessageChange} |
| 66 | + onKeyDown={sendMessage} |
27 | 67 | /> |
28 | 68 | </div> |
29 | | - <div className="absolute flex flex-col bg-white rounded p-4"> |
30 | | - <div className="flex justify-around"> |
31 | | - <Image |
32 | | - src="/female.png" |
33 | | - height={20} |
34 | | - width={20} |
35 | | - alt="profile-picture" |
36 | | - /> |
37 | | - <Image |
38 | | - src="/male.png" |
39 | | - height={20} |
40 | | - width={20} |
41 | | - alt="profile-picture" |
42 | | - /> |
43 | | - <Image |
44 | | - src="/unknown_gender.png" |
45 | | - height={20} |
46 | | - width={20} |
47 | | - alt="profile-picture" |
48 | | - /> |
49 | | - </div> |
50 | | - </div> |
51 | 69 | </div> |
52 | 70 | </div> |
53 | 71 | ); |
|
0 commit comments