import Layout from "~/components/Layout.js"; import { useRouter } from "next/router"; import { useState, useEffect } from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; import db from "~/utils/firebase"; import StartGame from "~/components/StartGame"; import { takeACard, isWild, isWildDrawFour, isDrawTwo } from "~/utils/game"; import Button from "~/components/Button"; import Main from "~/components/Main"; import Heading from "~/components/Heading"; import Footer from "~/components/Footer"; import useTranslation from "next-translate/useTranslation"; import getBaseUrl from "~/utils/getBaseUrl"; export default function Game() { const { t } = useTranslation(); const [room, setRoom] = useState(null); const [playersActive, setPlayersActive] = useState([]); const router = useRouter(); const roomId = router.query.roomId; const playerId = router.query.playerId; // const link_jugadores = router.asPath; useEffect(() => { if (roomId) { const roomRef = db.collection("rooms").doc(roomId); const roomUnsubscribe = roomRef.onSnapshot((roomRef) => { setRoom(roomRef.data()); }); const playersUnsubscribe = roomRef .collection("players") .onSnapshot(function (querySnapshot) { var players = []; querySnapshot.forEach(function (doc) { players.push(doc); }); setPlayersActive(players); }); return () => { roomUnsubscribe(); playersUnsubscribe(); }; } }, [roomId]); const onNewGame = (e) => { event.preventDefault(); const roomRef = db.collection("rooms").doc(roomId); let usedCards = {}; let firstCard = takeACard(usedCards); //ver que pasa si la primera carta es reverse while (isWild(firstCard)) { usedCards = {}; firstCard = takeACard(usedCards); } let drawCount = isDrawTwo(firstCard) ? 2 : 0; playersActive.forEach((playerActive) => { const cards = []; for (var i = 1; i <= 7; i++) { const card = takeACard(usedCards); cards.push(card); } playerActive.ref.set( { cards: cards, }, { merge: true } ); }); roomRef.set( { playing: true, discardPile: firstCard, currentMove: 0, deckDict: usedCards, isReverse: false, drawPile: false, drawCount: drawCount, yellOne: null, pennalty: null, }, { merge: true } ); }; if (!room) { return ( <Main color={"gray"}> <Layout /> <Heading type="h1" color="white"> {t("playerId:loading")} </Heading> </Main> ); } if (room.playing) { return ( <Main color={"gray"}> <Layout /> <StartGame room={room} roomId={roomId} playersActive={playersActive} playerId={playerId} onNewGame={onNewGame} /> </Main> ); } else { const playersSlots = []; for (let i = 0; i < room.count; i++) { const player = playersActive[i]; playersSlots.push( <li className="py-2 text-gray-700" key={i}> <div className="flex"> <span className="flex-auto"> {player ? player.data().name : t("playerId:waiting-player")} {player && player.id === playerId ? t("playerId:you") : null} </span> {player ? <span>✅</span> : null} </div> </li> ); } return ( <Main color="gray"> <Layout /> <div className="flex-auto px-4 py-8 px-4 py-8 mx-auto w-full"> <div className="flex items-center justify-center"> <div className="w-full max-w-lg "> <div className="bg-white p-4 rounded shadow"> <div className="my-4"> <p className="text-gray-700 font-bold"> {t("playerId:link")} </p> <input className="w-full text-gray-700 border-2 border-gray-300 h-12 mt-1 p-2 rounded g-gray-200 my-4" readOnly value={`${getBaseUrl()}/rooms/${roomId}`} ></input> <RoomLinkButton link={`${getBaseUrl()}/rooms/${roomId}`} /> </div> <div className="my-4"> <p className="text-gray-700 font-bold"> {t("playerId:players")} </p> <ol className="divide-y divide-gray-400 list-decimal pl-5"> {playersSlots} </ol> </div> {playersActive.map((player) => { const isAdmin = player.data().admin == true && player.id == playerId; return isAdmin ? ( <Button key={player.id} color={ playersActive.length == room.count ? "green" : "red" } onClick={onNewGame} className="w-full" disabled={isAdmin ? false : true} > {t("playerId:start")} </Button> ) : null; })} </div> </div> </div> </div> <Footer /> </Main> ); } } const RoomLinkButton = ({ link }) => { const { t } = useTranslation(); const [copiedLinkToClipboard, setCopiedLinkToClipboard] = useState(false); return ( <CopyToClipboard text={link} onCopy={() => { setCopiedLinkToClipboard(true); }} > <Button onBlur={() => setCopiedLinkToClipboard(false)} color={copiedLinkToClipboard ? "gray" : "yellow"} > {copiedLinkToClipboard ? t("playerId:copied") : t("playerId:copy-link")} </Button> </CopyToClipboard> ); };