import React, { useState, useCallback } from "react"; import "./Trade.css"; import { getPlayerName } from './Common.js'; import PlayerColor from './PlayerColor.js'; import Paper from '@material-ui/core/Paper'; import Button from '@material-ui/core/Button'; import Resource from './Resource.js'; const ResourceCounter = ({type, count, onCount, max}) => { count = count ? count : 0; const plusClicked = (event) => { if (max === undefined || max > count) { if (onCount) { onCount(type, count+1); } } }; const minusClicked = (event) => { if (count > 0) { if (onCount) { onCount(type, count-1); } } }; return (
{count}
); }; const Trade = ({table}) => { const [giveLine, setGiveLine] = useState('nothing'); const [getLine, setGetLine] = useState('nothing'); const [gives, setGives] = useState([]); const [gets, setGets] = useState([]); const giveCount = useCallback((type, count) => { gives[type] = count; if (!count) { delete gives[type]; } setGives(gives); const items = []; for (let key in gives) { items.push(`${gives[key]} ${key}`); } if (items.length === 0) { setGiveLine('nothing'); } else { setGiveLine(items.join(', ')); } }, [setGiveLine, setGives, gives]); const getCount = useCallback((type, count) => { gets[type] = count; if (!count) { delete gets[type]; } setGets(gets); const items = []; for (let key in gets) { items.push(`${gets[key]} ${key}`); } if (items.length === 0) { setGetLine('nothing'); } else { setGetLine(items.join(', ')); } }, [setGetLine, setGets, gets]); const meetClicked = useCallback((offer) => { const trade = { gives: offer.gets.slice(), gets: offer.gives.slice() }; trade.gives.forEach(give => giveCount(give.type, give.count)); trade.gets.forEach(get => getCount(get.type, get.count)); table.offerTrade(trade); let tmp = {}; trade.gives.forEach(give => { tmp[give.type] = give.count; }); setGives(tmp); tmp = {}; trade.gets.forEach(get => { tmp[get.type] = get.count; }); setGets(tmp); }, [giveCount, getCount, setGives, setGets, table]); if (!table.game) { return (<>); } const game = table.game; const isTurn = (table.game.turn && table.game.turn.color === table.game.color) ? true : false; const offerClicked = (event) => { const trade = { gives: [], gets: [] }; for (let key in gives) { trade.gives.push({type: key, count: gives[key]}); } for (let key in gets) { trade.gets.push({type: key, count: gets[key]}); } table.offerTrade(trade); } const acceptClicked = (offer) => { table.acceptTrade(offer); }; const cancelClicked = (event) => { table.cancelTrading(); } /* Non-current player has rejected the active player's * bid */ const rejectClicked = (trade) => { table.rejectTrade(trade); } let players = []; for (let color in table.game.players) { const item = table.game.players[color], name = getPlayerName(table.game.sessions, color); if (name && table.game.name !== name) { players.push({ name: name, color: color, valid: false, gets: item.gets ? item.gets : [], gives: item.gives ? item.gives : [], offerRejected: item.offerRejected ? true : false }); } } players.sort((A, B) => { return A.name.localeCompare(B.name); }); if (isTurn && table.game.player && table.game.player.banks) { table.game.player.banks.forEach(bank => { const count = (bank === 'bank') ? 3 : 2; players.push({ name: `The bank`, color: undefined, gives: [ { count: 1, type: '*' } ], gets: [ { count: count, type: bank } ], valid: false }); }); players.push({ name: `The bank`, color: undefined, gives: [ { count: 1, type: '*' } ], gets: [ { count: 4, type: 'bank' } ], valid: false }); } const player = (table.game && table.game.player) ? table.game.player : undefined; if (!player) { return <>; } let canAccept = false; if (table.game.turn.offer) { players.forEach(trade => { trade.valid = trade.gets.length && trade.gives.length && trade.gets.length === game.turn.offer.gives.length && trade.gives.length === game.turn.offer.gets.length; if (!trade.valid) { return; } trade.gets.forEach(get => { if (!trade.valid) { return; } if (get.type !== 'bank') { const offer = table.game.turn.offer.gives.find(give => give.type === get.type); trade.valid = offer && (offer.count === get.count); } else { /* Doesn't matter what the resource type is so long as there * are enough of the one kind */ trade.valid = table.game.turn.offer.gives[0].count === get.count; } }); if (!trade.valid) { return; } trade.gives.forEach(give => { if (!trade.valid) { return; } if (give.type !== '*') { const offer = table.game.turn.offer.gets.find(get => give.type === get.type); trade.valid = offer && (offer.count === give.count); } else { /* Doesn't matter what the resource type is so long as there * are enough of the one kind */ trade.valid = table.game.turn.offer.gets[0].count === give.count; } }) }); canAccept = true; table.game.turn.offer.gets.forEach(item => { if (!canAccept) { canAccept = (item.type in game.player); } if (!canAccept) { return; } canAccept = (game.player[item.type] >= item.count); }); } players = players.map((item, index) => { if (item.offerRejected) { return
{item.name}
has rejected your offer.
; } const gets = item.gets.map(get => `${get.count} ${(get.type === 'bank') ? 'of any one resource' : get.type}`) .join(', '), gives = item.gives.map(give => `${give.count} ${(give.type === '*') ? 'of any resource' : give.type}`) .join(', '); return (
{item.name}
{ gets !== '' && gives !== '' &&
wants {gets} and will give {gives}.
} { (gets === '' || gives === '') &&
has not submitted a trade offer.
} { isTurn && } { !isTurn && item.color === table.game.turn.color && <> }
); }); return (
Trading negotiations {isTurn ? '' : `with ${table.game.turn.name}`}
{ players }
{ !player.haveResources && You have no resources to participate in this trade. } { player.haveResources &&
You want to receive {getLine}:
You are willing to give {giveLine}:
{ player.brick > 0 && } { player.wood > 0 && } { player.wheat > 0 && } { player.sheep > 0 && } { player.stone > 0 && }
} { isTurn && }
); }; export default Trade;