📂 File Structure

🚀 Source Code
main.js
const chatForm = document.getElementById("chat-form");
const chatMessages = document.querySelector(".chat-messages");
const rommName = document.getElementById("room-name");
const userList = document.getElementById("users");
const { username, room } = Qs.parse(location.search, {
ignoreQueryPrefix: true,
});
const socket = io();
socket.emit("joinRoom", { username, room });
socket.on("roomUsers", ({ room, users }) => {
outputRoomName(room);
outputUsers(users);
});
socket.on("message", (message) => {
console.log(message);
outputMessage(message);
});
chatForm.addEventListener("submit", (e) => {
e.preventDefault();
const msg = e.target.elements.msg.value;
socket.emit("chatMessage", msg);
chatMessages.scrollTop = chatMessages.scrollHeight;
e.target.elements.msg.value = "";
e.target.elements.msg.focus();
});
function outputMessage(message) {
const div = document.createElement("div");
div.classList.add("message");
div.innerHTML = `<p class="meta">${message.username} <span>${message.time}</span></p>
<p class="text">
${message.text}
</p>`;
document.querySelector(".chat-messages").appendChild(div);
}
function outputRoomName(room) {
rommName.innerText = room;
}
function outputUsers(users) {
userList.innerHTML = `
${users.map((user) => `<li>${user.username}</li>`).join("")}
`;
}

server.js
const path = require("path");
const http = require("http");
const express = require("express");
const socketio = require("socket.io");
const formatMessage = require("./utils/messages");
const {
userJoin,
getCurrentUser,
userLeave,
getRoomUsers,
} = require("./utils/users");
const app = express();
const server = http.createServer(app);
const io = socketio(server);
app.use(express.static(path.join(__dirname, "public")));
const Admin = "Admin";
io.on("connection", (socket) => {
socket.on("joinRoom", ({ username, room }) => {
const user = userJoin(socket.id, username, room);
socket.join(user.room);
socket.emit("message", formatMessage(Admin, "Welcome to Chat Room!"));
socket.broadcast
.to(user.room)
.emit(
"message",
formatMessage(Admin, `${user.username} has joined the chat`)
);
io.to(user.room).emit("roomUsers", {
room: user.room,
users: getRoomUsers(user.room),
});
});
socket.on("chatMessage", (msg) => {
const user = getCurrentUser(socket.id);
io.to(user.room).emit("message", formatMessage(user.username, msg));
});
socket.on("disconnect", () => {
const user = userLeave(socket.id);
console.log("🌸", user);
if (user) {
io.to(user.room).emit(
"message",
formatMessage(Admin, `${user.username} has left the chat`)
);
io.to(user.room).emit("roomUsers", {
room: user.room,
users: getRoomUsers(user.room),
});
}
});
});
const PORT = 3000 || process.env.PORT;
server.listen(PORT, () => console.log(`🚀 SERVER RUNNING ON ${PORT}`));
users.js
const users = [];
function userJoin(id, username, room) {
const user = { id, username, room };
users.push(user);
return user;
}
function getCurrentUser(id) {
return users.find((user) => user.id === id);
}
function userLeave(id) {
const index = users.findIndex((user) => user.id === id);
if (index !== -1) {
return users.splice(index, 1)[0];
}
}
function getRoomUsers(room) {
return users.filter((user) => user.room === room);
}
module.exports = {
userJoin,
getCurrentUser,
userLeave,
getRoomUsers,
};
messages.js
const moment = require("moment");
function formatMessage(username, text) {
return {
username,
text,
time: moment().format("h:mm a"),
};
}
module.exports = formatMessage;
📓 Libraries
qs cdn Library

https://www.youtube.com/watch?v=jD7FnbI76Hg