**************LIVE CHAT****************

 FOR THE LIVE CHAT, WE WILL BE USING SOCKETS. TO DISPLAY THE CHAT BOX, IN THE PREVIOUS BLOG WE DISCUSSED ABOUT ICONS. IN THE ICONS SECTION ,WE CREATED A FORUM ICON WITH A BADGE, THE BADGE REPRSENTS THE NO.OF MESSAGES.




 <Badge
                color="secondary"
                onClick={() => setShowChat(!showChat)}
                badgeContent={newMessages}
                max={999}
                sx={{
                  "&:hover": {
                    opacity: "0.5",
                    cursor: "pointer",
                  },
                }}
              >
                {" "}
                {showChat ? (
                  <ForumOutlinedIcon style={{ color: "white" }} />
                ) : (
                  <ForumIcon style={{ color: "white" }} />
                )}
              </Badge>




VIDEOCONFERENCE.JSX

  const [newMessages, setNewMessages] = useState([]);
  const [message, setMessage] = useState("");
  const [messages, setMessages] = useState([]);
  const bottomRef = useRef();
  const [showChat, setShowChat] = useState();

THE BOTTOM REF IS USED INORDER TO SCROLL DOWN TO THE BOTTOM WHEN A NEW CHAT APPEARS.

 useEffect(() => {
    bottomRef.current?.scrollIntoView();
  }, [messages]);

IN CONNECTTOSERVER() FUNCTION

    socketRef.current.on("signal", gotMessageFromServer);
    socketRef.current.on("chat-message", addMessage);


  let addMessage = (data, sender, socketIdSender) => {
    setMessages((prevMsg) => [...prevMsg, { sender: sender, data: data }]);
    if (socketIdSender !== socketIdRef.current) {
      setNewMessages((prevMsg) => prevMsg + 1);
    }
  };
  let sendMessage = () => {
    socketRef.current.emit("chat-message", message, username);

    setMessage("");
  };



ON THE BACKEND:

SOCKETCONTROLLER.JS

io.to(room).emit("user-joined", {
        id: socket.id,
        clients: clientDetails,
      });
      if (messages[room]) {
        messages[room].forEach((msg) => {
          io.to(socket.id).emit(
            "chat-message",
            msg["data"],
            msg["sender"],
            msg["socketID-sender"]
          );
        });
      }
      if (username) {
        const meeting = await Meeting.findOne({ meeting_code: room });
        if (
          meeting &&
          !meeting.participants.some((p) => p.username === username)
        ) {
          meeting.participants.push({
            username,
            role: userRoles[socket.id],
          });
          await meeting.save();
        }
      }
    });
    socket.on("signal", (toId, message) => {
      // console.log(socket.id);
      // console.log(message);
      io.to(toId).emit("signal", socket.id, message);
    });
    socket.on("chat-message", (data, sender) => {
      const [matchingRoom, found] = Object.entries(connections).reduce(
        ([room, isFound], [roomKey, roomVal]) => {
          if (!isFound && roomVal.includes(socket.id)) {
            return [roomKey, true];
          }
        },
        ["", false]
      );

      if (found) {
        if (messages[matchingRoom] === undefined) {
          messages[matchingRoom] = [];
        }
        messages[matchingRoom].push({
          sender: sender,
          data: data,
          "socketID-sender": socket.id,
        });
        connections[matchingRoom].forEach((element) => {
          io.to(element).emit("chat-message", data, sender, socket.id);
        });
      }
    });


HERE, WE MADE THE STRUCTURE IN SUCH A WAY THAT, THE SENDER MESSAGES ARE DISPLAYED ON THE RIGHT SIDE AND RECEIVED CHAT ON THE LEFT SIDE OF THE CHAT WINDOW.


<div className={styles.showChats}>
                  {messages.length > 0 ? (
                    messages.map((msg, index) => {
                      return (
                        <>
                          {msg.sender === username ? (
                            <div key={index} className={styles.sentChat}>
                              <p style={{ fontWeight: "bolder" }}>YOU</p>
                              <p>{msg.data}</p>
                            </div>
                          ) : (
                            <div key={index} className={styles.receivedChat}>
                              <p style={{ fontWeight: "bolder" }}>
                                {msg.sender.toUpperCase()}
                              </p>
                              <p>{msg.data}</p>
                            </div>
                          )}
                          <div ref={bottomRef}></div>
                        </>
                      );
                    })
                  ) : (
                    <>
                      <p>No messages yet!</p>
                    </>
                  )}
                </div>






Comments

Popular posts from this blog

MIDDLEWARE.JS

MODELS

AUTHENTICATION PAGE