From 2ea81493ba9a6dd37b0cf61389bb46aae1c918b1 Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Sat, 1 Mar 2025 17:17:00 +0100 Subject: [PATCH] Fix vote bug --- client/src/pages/WaitingRoom/WaitingRoom.jsx | 24 +++++++++++++-- server/controller/room.js | 13 ++++---- server/handler/connection.js | 31 ++++++++++++++++---- 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/client/src/pages/WaitingRoom/WaitingRoom.jsx b/client/src/pages/WaitingRoom/WaitingRoom.jsx index e3e8e87..fdf7326 100644 --- a/client/src/pages/WaitingRoom/WaitingRoom.jsx +++ b/client/src/pages/WaitingRoom/WaitingRoom.jsx @@ -76,14 +76,34 @@ export const WaitingRoom = () => { }; const handlePlaylistOptions = (options) => { - setPlaylists(options); + const playlistsWithVotes = { ...options }; + Object.keys(playlistsWithVotes).forEach(genre => { + const playlistId = playlistsWithVotes[genre].id; + playlistsWithVotes[genre].votes = votes[playlistId]?.length || 0; + }); + setPlaylists(playlistsWithVotes); }; const handleVotesUpdated = (newVotes) => { + console.log('Received updated votes:', newVotes); setVotes(newVotes); + + setPlaylists(current => { + const updated = { ...current }; + Object.keys(updated).forEach(genre => { + const playlistId = updated[genre].id; + updated[genre].votes = newVotes[playlistId]?.length || 0; + }); + return updated; + }); + + Object.entries(newVotes).forEach(([playlistId, voters]) => { + if (voters.includes(socket.id)) { + setSelectedPlaylist(playlistId); + } + }); }; - // Register event listeners const cleanupHostStatus = on("host-status", handleHostStatus); const cleanupUserInfo = on("user-info", handleUserInfo); const cleanupRoomUsers = on("room-users", handleRoomUsers); diff --git a/server/controller/room.js b/server/controller/room.js index f08547b..5e40b86 100644 --- a/server/controller/room.js +++ b/server/controller/room.js @@ -163,19 +163,20 @@ module.exports.voteForPlaylist = (roomId, userId, playlistId) => { const room = rooms[roomId]; if (room.state !== 'waiting') return false; - const previousVote = Object.entries(room.playlistVotes) - .find(([_, voters]) => voters.includes(userId)); - - if (previousVote) { - room.playlistVotes[previousVote[0]] = - room.playlistVotes[previousVote[0]].filter(id => id !== userId); + if (!room.playlistVotes) { + room.playlistVotes = {}; } + Object.entries(room.playlistVotes).forEach(([pid, voters]) => { + room.playlistVotes[pid] = voters.filter(id => id !== userId); + }); + if (!room.playlistVotes[playlistId]) { room.playlistVotes[playlistId] = []; } room.playlistVotes[playlistId].push(userId); + console.log(`Updated votes for room ${roomId}:`, room.playlistVotes); return true; }; diff --git a/server/handler/connection.js b/server/handler/connection.js index 582ce81..e73b855 100644 --- a/server/handler/connection.js +++ b/server/handler/connection.js @@ -117,7 +117,7 @@ module.exports = (io) => (socket) => { } }); - socket.on("join-room", ({roomId, name}) => { + socket.on("join-room", async ({roomId, name}) => { if (currentRoomId) return socket.emit("already-in-room", currentRoomId); roomId = roomId.toString().toUpperCase(); @@ -128,14 +128,35 @@ module.exports = (io) => (socket) => { } currentUser = {id: socket.id, name: name.toString()}; - roomController.connectUserToRoom(roomId, currentUser); + await roomController.connectUserToRoom(roomId, currentUser); socket.join(roomId); const users = roomController.getRoomUsers(roomId); - io.to(roomId).emit("room-users-update", users); - socket.to(roomId).emit("user-connected", currentUser); - + const votes = roomController.getPlaylistVotes(roomId); + const availablePlaylists = roomController.getAvailablePlaylists(roomId); + socket.emit("room-joined", roomId); + socket.emit("room-users", users); + socket.emit("playlist-votes-updated", votes); + + try { + const details = await youtubeService.getPlaylistDetails(availablePlaylists); + Object.keys(details).forEach(genre => { + const playlistId = details[genre].id; + details[genre].votes = votes[playlistId]?.length || 0; + }); + socket.emit("playlist-options", details); + } catch (error) { + console.error("Error sending playlist details to new user:", error); + socket.emit("error", { + message: "Failed to load playlists", + details: error.message + }); + } + + socket.to(roomId).emit("user-connected", currentUser); + io.to(roomId).emit("room-users-update", users); + currentRoomId = roomId; } else { socket.emit("room-not-found", roomId);