mirror of
https://github.com/randyjc/Rahoot.git
synced 2026-03-13 20:15:35 +01:00
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
"use client"
|
|
|
|
import { Player } from "@rahoot/common/types/game"
|
|
import { ManagerStatusDataMap } from "@rahoot/common/types/game/status"
|
|
import { useEvent, useSocket } from "@rahoot/web/contexts/socketProvider"
|
|
import { useState } from "react"
|
|
|
|
type Props = {
|
|
data: ManagerStatusDataMap["SHOW_ROOM"]
|
|
}
|
|
|
|
export default function Room({ data: { text, inviteCode } }: Props) {
|
|
const { socket } = useSocket()
|
|
const [playerList, setPlayerList] = useState<Player[]>([])
|
|
const [totalPlayers, setTotalPlayers] = useState(0)
|
|
|
|
useEvent("manager:newPlayer", (player) => {
|
|
setPlayerList([...playerList, player])
|
|
})
|
|
|
|
useEvent("manager:removePlayer", (playerId) => {
|
|
setPlayerList(playerList.filter((p) => p.id !== playerId))
|
|
})
|
|
|
|
useEvent("manager:playerKicked", (playerId) => {
|
|
setPlayerList(playerList.filter((p) => p.id !== playerId))
|
|
})
|
|
|
|
useEvent("game:totalPlayers", (total) => {
|
|
setTotalPlayers(total)
|
|
})
|
|
|
|
const handleKick = (playerId: string) => () => {
|
|
socket?.emit("manager:kickPlayer", {
|
|
data: { playerId },
|
|
})
|
|
}
|
|
|
|
return (
|
|
<section className="relative mx-auto flex w-full max-w-7xl flex-1 flex-col items-center justify-center px-2">
|
|
<div className="mb-10 rotate-3 rounded-md bg-white px-6 py-4 text-6xl font-extrabold">
|
|
{inviteCode}
|
|
</div>
|
|
|
|
<h2 className="mb-4 text-4xl font-bold text-white drop-shadow-lg">
|
|
{text}
|
|
</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">
|
|
{playerList.map((player) => (
|
|
<div
|
|
key={player.id}
|
|
className="shadow-inset bg-primary rounded-md px-4 py-3 font-bold text-white"
|
|
onClick={handleKick(player.id)}
|
|
>
|
|
<span className="cursor-pointer text-xl drop-shadow-md hover:line-through">
|
|
{player.username}
|
|
</span>
|
|
</div>
|
|
))}
|
|
</div>
|
|
</section>
|
|
)
|
|
}
|