**************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
Post a Comment