So I have this simple chat application, and I'm looking to adapt it so the users can use the 4 different rooms I created. I'll try to explain how it works first, and I need to be guided, what would be the steps I need to take in order to make it work?(considering I'm a beginner) I've tried a lot of things but it always came out really buggy.
Client side:
//Get the room name out of the URL and send it to the server
function getRoomName() {
let roomName = window.location.toString();
if(roomName.includes('#') === true){
roomName = roomName.split("#");
roomName.splice(0, 1);
roomName = roomName.toString();
// Join room
socket.emit('joinRoom', roomName);
}
}
//Here I am changing the URL when clicking on a room button (I got one of these for each button)
proiectFinalRoom.addEventListener('click', () =>{
window.location.href='#proiectFinal';
roomNameEdit.innerHTML = "#PROIECT-FINAL";
})
sendBtn.addEventListener('click', () =>{
sendMessage();
})
//Here I am sending the message to the server
function sendMessage(){
if(messageInput.value === ""){
return;
} else {
//Calling the getRoomName function (when sending a message)
getRoomName();
const text = messageInput.value;
socket.emit('message', text);
displayMessage();
}
}
Server side:
io.on('connection', (socket) => {
socket.on('joinRoom', function(roomName){
//Join room
socket.join(roomName);
//Send messages
socket.on('message', (message) => {
socket.broadcast.to(roomName).emit('message', `${message}`);
});
});
});
This is the stage I am at right now, and It is definetely not working as it should. I already read a lot of articles about socket.io and rooms, but since english is not my first language I find it hard to understand where the problem is in my code.
I think your Server side "message" call might be too nested. I would do something like this (keeping in mind that sockets maintains a collection of rooms):
io.on('connection', (socket) => {
socket.on('joinRoom', function(roomName){
//Join room
socket.join(roomName);
});
//Send messages
socket.on('message', (message) => {
var room = getRoom(socket);
socket.to(room).emit('message', `${message}`);
});
});
function getRoom(socket) {
var room;
for (let aRoom of socket.rooms) {
if (aRoom !== socket.id) {
room = aRoom;
}
}
return room;
}
On the Client Side you use something like this. This way you only join the room once (I'm using React here):
const [room, setRoom] = useState<string>();
...
const socket = useContext(SocketContext);
useEffect(() => {
if (!room) {
if (param) {
var myRoom = param['room'];
if (!myRoom) {
socket.emit("ping");
} else {
socket.emit('join room', myRoom);
setRoom(myRoom);
}
} else {
socket.emit("ping");
}
}
}, [room, param, socket]);