import React, { useEffect, useState, useRef } from "react"; import { useNavigate } from "react-router-dom"; import "./css/Chat.css"; import { FaPaperPlane, FaSmile } from "react-icons/fa"; import { get, post } from "../backend/api"; import { displayMessage } from "../backend/notifications/notifications"; import { MessageType } from "../backend/notifications/message"; import io from "socket.io-client"; const emojis = [ "๐Ÿ˜€", "๐Ÿ˜", "๐Ÿ˜‚", "๐Ÿคฃ", "๐Ÿ˜ƒ", "๐Ÿ˜„", "๐Ÿ˜…", "๐Ÿ˜†", "๐Ÿ˜‰", "๐Ÿ˜Š", "๐Ÿ˜‹", "๐Ÿ˜Ž", "๐Ÿ˜", "๐Ÿ˜˜", "๐Ÿฅฐ", "๐Ÿ˜—", "๐Ÿ˜™", "๐Ÿ˜š", "๐Ÿ™‚", "๐Ÿค—", "๐Ÿคฉ", "๐Ÿค”", "๐Ÿ˜", "๐Ÿ˜‘", "๐Ÿ˜ถ", "๐Ÿ™„", "๐Ÿ˜", "๐Ÿ˜ฃ", "๐Ÿ˜ฅ", "๐Ÿ˜ฎ", "๐Ÿค", "๐Ÿ˜ฏ", "๐Ÿ˜ช", "๐Ÿ˜ซ", "๐Ÿ˜ด", "๐Ÿ˜Œ", "๐Ÿ˜›", "๐Ÿ˜œ", "๐Ÿคช", "๐Ÿคจ", "๐Ÿ˜", "๐Ÿค‘", "๐Ÿ˜’", "๐Ÿ˜“", "๐Ÿ˜”", "๐Ÿ˜•", "๐Ÿ˜–", "๐Ÿ˜ž", "๐Ÿ˜Ÿ", "๐Ÿ˜ ", "๐Ÿ˜ก", "๐Ÿคฌ", "๐Ÿ˜ฑ", "๐Ÿ˜จ", "๐Ÿ˜ง", "๐Ÿ˜‡", "๐Ÿฅณ", "๐Ÿฅบ", "๐Ÿ˜ป", "๐Ÿ˜ผ", "๐Ÿ˜ฝ", "๐Ÿ™ˆ", "๐Ÿ™‰", "๐Ÿ™Š", "๐Ÿ’€", "๐Ÿ‘ป", "๐Ÿ‘ฝ", ]; const Chat = () => { const [interlocutorId, setInterlocutorId] = useState(""); const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); const [showEmojiPicker, setShowEmojiPicker] = useState(false); const socket = useRef(null); const chatRef = useRef(null); const navigate = useNavigate(); const [myId, setMyId] = useState(""); useEffect(() => { const id = localStorage.getItem("interlocutorId"); setInterlocutorId(id); const username = localStorage.getItem("username"); setMyId(username); if (!id || !username) { displayMessage("You are not logged in!", MessageType.WARN); return () => {}; } socket.current = io("http://localhost:8099"); socket.current.on("receiveMessage", (message) => { setMessages((prev) => [...prev, message]); }); socket.current.on("connect_error", (err) => { console.error("Connection Error:", err.message); }); return () => { socket.current.disconnect(); }; }, []); useEffect(() => { // retrieveMessages().then(); const interval = setInterval(() => { retrieveMessages().then() }, 2000); return () => clearInterval(interval) }, [myId, interlocutorId]); useEffect(() => { if (chatRef.current) { chatRef.current.scrollTop = chatRef.current.scrollHeight; } }, [messages]); async function sendMessageToDB(messageData) { const { ok, data } = await post( "/chat/message/" + myId + "/" + interlocutorId, { message: messageData } ); if (!ok) { displayMessage(data.message, MessageType.ERROR); } } async function retrieveMessages() { if (!myId || !interlocutorId) return; const { ok, data } = await get("/chat/item/" + myId + "/" + interlocutorId); if (!ok) { displayMessage(data.message, MessageType.ERROR); return; } setMessages(data.chat.messages); } const sendMessage = () => { if (newMessage.trim()) { const messageData = { senderId: myId, recipientId: interlocutorId, data: newMessage, timestamp: new Date().toLocaleString(), }; socket.current.emit("sendMessage", messageData); setMessages((prev) => [...prev, messageData]); sendMessageToDB(messageData).then(); setNewMessage(""); } }; const handleKeyPress = (e) => { if (e.key === "Enter") { sendMessage(); } }; const handleEmojiSelect = (emoji) => { setNewMessage((prev) => prev + emoji); setShowEmojiPicker(false); }; return (

Chat with ... (id = {interlocutorId})

{messages.map((msg, index) => (
{msg.senderId === myId ? "You" : "They"}: {msg.data}
{msg.timestamp}
))}
setNewMessage(e.target.value)} placeholder="Type a message..." className="chat-input" onKeyDown={handleKeyPress} /> {showEmojiPicker && (
{emojis.map((emoji, index) => ( handleEmojiSelect(emoji)} style={{ cursor: "pointer", padding: "5px" }} > {emoji} ))}
)}
); }; export default Chat;