Lobby.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import React from "react";
  2. import "./css/lobby.css"
  3. import Colors from "./util/colors";
  4. import deck from './img/deck.svg';
  5. import { Commands } from "./StateRouter";
  6. export default function Lobby({ message, pickColor, deal }) {
  7. const { color, options, state, game_code, others, name,...args } = message;
  8. const circle_args = { state, myColor: color, myName: name, others, pickColor };
  9. const canDeal = options.find((o) => o.code === Commands.DEAL);
  10. return <div className="mt-4">
  11. <div className="row my-2">
  12. <h1>Je kan meedoen door naar <a href={`/${game_code}`}>{window.location.host}/{game_code}</a> te gaan
  13. </h1>
  14. </div>
  15. <div className="row justify-content-center my-2">
  16. <Circle color={Colors.RED} {...circle_args}/>
  17. <Circle color={Colors.YELLOW} {...circle_args}/>
  18. <Circle color={Colors.BLUE} {...circle_args}/>
  19. <Circle color={Colors.GREEN} {...circle_args}/>
  20. </div>
  21. {
  22. canDeal &&
  23. <div className="row justify-content-center my-2">
  24. <div className="btn btn-link" onClick={deal}>
  25. <img src={deck} alt="kaartenstapel"/>
  26. <br/>
  27. <span>Delen</span>
  28. </div>
  29. </div>
  30. }
  31. </div>
  32. }
  33. function Circle({ color, myColor, myName, others, pickColor }) {
  34. const isMine = color === myColor;
  35. const playerInfo = isMine ?
  36. {color, name: myName} :
  37. others.find((o) => o.color === color);
  38. const isSelectable = !(playerInfo ?? false);
  39. const isPicked = !isSelectable;
  40. const name = (playerInfo && playerInfo.name) || "";
  41. return <div className="col-2 flex-column">
  42. <div className={`color-pick
  43. ${color} ${isPicked ? "selected" : ""}
  44. ${isSelectable ? "selectable" : ""}
  45. ${isMine ? "mine" : ""}`}
  46. onClick={() => isSelectable && pickColor(color)}
  47. />
  48. <h4>{name}</h4>
  49. </div>
  50. }