File size: 2,370 Bytes
90cbf22
 
 
 
 
df2ef4f
90cbf22
df2ef4f
 
90cbf22
 
 
df2ef4f
 
 
 
 
 
90cbf22
 
 
df2ef4f
 
 
 
 
 
90cbf22
df2ef4f
 
 
 
 
 
 
 
 
 
 
 
 
90cbf22
 
df2ef4f
 
90cbf22
 
 
df2ef4f
90cbf22
 
df2ef4f
 
 
 
90cbf22
df2ef4f
90cbf22
df2ef4f
90cbf22
 
df2ef4f
90cbf22
 
 
 
 
 
df2ef4f
90cbf22
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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>
  )
  


}