Emit total players count to clients in the room on player join and kick events

This commit is contained in:
Muhammad Rais Ramadhani
2025-09-13 18:14:56 +07:00
parent 0bdec93c21
commit 93b1098e74
4 changed files with 27 additions and 1 deletions

View File

@@ -37,6 +37,9 @@ const Manager = {
io.in(playerId).socketsLeave(game.room) io.in(playerId).socketsLeave(game.room)
io.to(player.id).emit("game:kick") io.to(player.id).emit("game:kick")
io.to(game.manager).emit("manager:playerKicked", player.id) io.to(game.manager).emit("manager:playerKicked", player.id)
// Emit updated total players to all clients in the room
io.to(game.room).emit("game:totalPlayers", game.players.length)
}, },
startGame: async (game, io, socket) => { startGame: async (game, io, socket) => {

View File

@@ -56,6 +56,9 @@ const Player = {
game.players.push(playerData) game.players.push(playerData)
// Emit total players to all players in the room
io.to(player.room).emit("game:totalPlayers", game.players.length)
socket.emit("game:successJoin") socket.emit("game:successJoin")
}, },
@@ -82,6 +85,8 @@ const Player = {
data: { text: "Waiting for the players to answer" }, data: { text: "Waiting for the players to answer" },
}) })
socket.to(game.room).emit("game:playerAnswer", game.playersAnswer.length) socket.to(game.room).emit("game:playerAnswer", game.playersAnswer.length)
// Also emit total players to keep the UI updated
io.to(game.room).emit("game:totalPlayers", game.players.length)
if (game.playersAnswer.length === game.players.length) { if (game.playersAnswer.length === game.players.length) {
abortCooldown() abortCooldown()

View File

@@ -43,6 +43,7 @@ export default function Answers({
const [percentages, setPercentages] = useState([]) const [percentages, setPercentages] = useState([])
const [cooldown, setCooldown] = useState(time) const [cooldown, setCooldown] = useState(time)
const [totalAnswer, setTotalAnswer] = useState(0) const [totalAnswer, setTotalAnswer] = useState(0)
const [totalPlayer, setTotalPlayer] = useState(0)
const [sfxPop] = useSound(SFX_ANSWERS_SOUND, { const [sfxPop] = useSound(SFX_ANSWERS_SOUND, {
volume: 0.1, volume: 0.1,
@@ -102,9 +103,14 @@ export default function Answers({
sfxPop() sfxPop()
}) })
socket.on("game:totalPlayers", (total) => {
setTotalPlayer(total)
})
return () => { return () => {
socket.off("game:cooldown") socket.off("game:cooldown")
socket.off("game:playerAnswer") socket.off("game:playerAnswer")
socket.off("game:totalPlayers")
} }
}, [sfxPop]) }, [sfxPop])
@@ -150,7 +156,7 @@ export default function Answers({
</div> </div>
<div className="flex flex-col items-center rounded-full bg-black/40 px-4 text-lg font-bold"> <div className="flex flex-col items-center rounded-full bg-black/40 px-4 text-lg font-bold">
<span className="translate-y-1 text-sm">Answers</span> <span className="translate-y-1 text-sm">Answers</span>
<span>{totalAnswer}</span> <span>{totalAnswer}/{totalPlayer}</span>
</div> </div>
</div> </div>
)} )}

View File

@@ -4,6 +4,7 @@ import { useEffect, useState } from "react"
export default function Room({ data: { text, inviteCode } }) { export default function Room({ data: { text, inviteCode } }) {
const { socket } = useSocketContext() const { socket } = useSocketContext()
const [playerList, setPlayerList] = useState([]) const [playerList, setPlayerList] = useState([])
const [totalPlayers, setTotalPlayers] = useState(0)
useEffect(() => { useEffect(() => {
socket.on("manager:newPlayer", (player) => { socket.on("manager:newPlayer", (player) => {
@@ -18,10 +19,15 @@ export default function Room({ data: { text, inviteCode } }) {
setPlayerList(playerList.filter((p) => p.id !== playerId)) setPlayerList(playerList.filter((p) => p.id !== playerId))
}) })
socket.on("game:totalPlayers", (total) => {
setTotalPlayers(total)
})
return () => { return () => {
socket.off("manager:newPlayer") socket.off("manager:newPlayer")
socket.off("manager:removePlayer") socket.off("manager:removePlayer")
socket.off("manager:playerKicked") socket.off("manager:playerKicked")
socket.off("game:totalPlayers")
} }
}, [playerList]) }, [playerList])
@@ -35,6 +41,12 @@ export default function Room({ data: { text, inviteCode } }) {
{text} {text}
</h2> </h2>
<div className="mb-6 flex items-center justify-center rounded-full bg-black/40 px-6 py-3">
<span className="text-2xl font-bold text-white drop-shadow-md">
Players Joined: {totalPlayers}
</span>
</div>
<div className="flex flex-wrap gap-3"> <div className="flex flex-wrap gap-3">
{playerList.map((player) => ( {playerList.map((player) => (
<div <div