Spaces:
Sleeping
Sleeping
| import { ServerGame } from "@/hooks/serverGame"; | |
| import { GameId } from "../../convex/aiTown/ids"; | |
| import Button from "./buttons/Button"; | |
| import { Id } from '../../convex/_generated/dataModel'; | |
| import { characters } from "../../data/characters"; | |
| import { Stage } from "@pixi/react"; | |
| import { Character } from "./Character"; | |
| import { Player } from "../../convex/aiTown/player"; | |
| export type Vote = (id: GameId<'players'>[]) => void; | |
| export const VoteModal = ({ | |
| engineId, | |
| game, | |
| playerId, | |
| maxVotes=1, | |
| players, | |
| votes, | |
| onVote, | |
| compact | |
| }: { | |
| engineId: Id<'engines'>, | |
| game: ServerGame, | |
| playerId: GameId<'players'>, | |
| maxVotes: number, | |
| players: Player[], | |
| votes: GameId<'players'>[], | |
| onVote: (votes: GameId<'players'>[]) => void, | |
| compact: boolean | |
| }) => { | |
| const vote = (playerId: GameId<'players'>) => { | |
| let newVotes = votes; | |
| if (votes.includes(playerId)) { | |
| newVotes = newVotes.filter((vote) => vote !== playerId); | |
| } else { | |
| newVotes = [...votes, playerId]; | |
| } | |
| if (newVotes.length > maxVotes) { | |
| // Removed the first vote and add the new vote | |
| newVotes = newVotes.slice(1); | |
| } | |
| console.log(`votes: ${newVotes.map((vote) => game.playerDescriptions.get(vote)?.name).join(", ")}`) | |
| onVote(newVotes); | |
| } | |
| return ( | |
| <div className={`flex gap-4 ${compact ? "flex-col" : "flex-wrap justify-center"}`}> | |
| {players.map((playable) => { | |
| const playerDesc = game.playerDescriptions.get(playable.id); | |
| const character = characters.find((c) => c.name === playerDesc?.character); | |
| if (!character) return null; | |
| const selected = votes.includes(playable.id); | |
| return ( | |
| <> | |
| <Button onClick={() => vote(playable.id)} | |
| className="lg:block border-2 border-gold min-w-[100px]" | |
| title={playerDesc?.name} | |
| selected={selected} | |
| key={playable.id} | |
| disabled={selected} | |
| > | |
| {playerDesc?.name} | |
| <Stage width={30} height={40} options={{backgroundAlpha: 0.0}}> | |
| { | |
| <Character textureUrl={character.textureUrl} isViewer={true} spritesheetData={character.spritesheetData} x={15} y={15} orientation={0} onClick={() => {} } /> | |
| } | |
| </Stage> | |
| </Button> | |
| </> | |
| ) | |
| })} | |
| </div> | |
| ) | |
| } | |