import React, {useEffect, useContext, useMemo, useRef, useState, useCallback} from "react"; import equal from "fast-deep-equal"; import Paper from '@material-ui/core/Paper'; import Button from '@material-ui/core/Button'; import "./ViewCard.css"; import { Resource } from './Resource.js'; import { GlobalContext } from "./GlobalContext.js"; const ViewCard = ({cardActive, setCardActive}) => { const { ws } = useContext(GlobalContext); const [priv, setPriv] = useState(undefined); const [turns, setTurns] = useState(0); const [rules, setRules] = useState({}); const fields = useMemo(() => [ 'private', 'turns', 'rules' ], []); const onWsMessage = (event) => { const data = JSON.parse(event.data); switch (data.type) { case 'game-update': console.log(`view-card - game update`); if ('private' in data.update && !equal(data.update.private, priv)) { setPriv(data.update.private); } if ('turns' in data.update && data.update.turns !== turns) { setTurns(data.update.turns); } if ('rules' in data.update && !equal(data.update.rules, rules)) { setRules(data.update.rules); } break; default: break; } }; const refWsMessage = useRef(onWsMessage); useEffect(() => { refWsMessage.current = onWsMessage; }); useEffect(() => { if (!ws) { return; } const cbMessage = e => refWsMessage.current(e); ws.addEventListener('message', cbMessage); return () => { ws.removeEventListener('message', cbMessage); } }, [ws, refWsMessage]); useEffect(() => { if (!ws) { return; } ws.send(JSON.stringify({ type: 'get', fields })); }, [ws, fields]); const playCard = useCallback((event) => { ws.send(JSON.stringify({ type: 'play-card', card: cardActive })); setCardActive(undefined); }, [ws, cardActive, setCardActive]); const close = (event) => { setCardActive(undefined); }; if (!cardActive) { return <>>; } const capitalize = (string) => { if (string === 'vp') { return 'Victory Point'; } if (string === 'army') { return 'Knight'; } return string.charAt(0).toUpperCase() + string.slice(1); }; let description, lookup; if (cardActive.type === 'progress') { lookup = `${cardActive.type}-${cardActive.card}`; } else { lookup = cardActive.type; } const points = ('victory-points' in rules) && rules['victory-points'].enabled ? rules['victory-points'].points : 0; let cardName = ''; switch (lookup) { case 'army': cardName = 'Knight'; description = <>