|
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