diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-09-22 06:58:59 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-09-22 06:58:59 -0400 |
commit | d66f16ae60190eebe711f7f2fb931513d711cd32 (patch) | |
tree | 132a04b47a213002d7247f3f4f7a69221b871327 /webapp | |
parent | 1d13f53d8dd72921bb6e05839ef125061b567be8 (diff) |
Allow card play in game component
Diffstat (limited to 'webapp')
-rw-r--r-- | webapp/src/components/game.rs | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/webapp/src/components/game.rs b/webapp/src/components/game.rs index d367396..e893691 100644 --- a/webapp/src/components/game.rs +++ b/webapp/src/components/game.rs @@ -1,14 +1,14 @@ -use crate::bridge_engine::{self, Contract, Player, PlayingDeal}; +use crate::bridge_engine::{self, Contract, Player, PlayingDeal, PlayingDealResult}; use crate::card; use crate::card::Deal; use crate::card::Suit; use crate::components::{Bidding, Hand, ShowBid}; -use log::info; +use log::{error, info}; use yew::prelude::*; pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade]; -#[derive(Debug)] +#[derive(Debug, Clone)] enum GameState { Bidding { dealer: Player, @@ -60,7 +60,28 @@ pub fn game() -> Html { }) }; - let on_card_clicked = { Callback::from(move |card| info!("Card clicked: {}", card)) }; + let on_card_clicked = { + let state = state.clone(); + Callback::from(move |card| { + if let GameState::Play { + playing_deal, + contract, + bidding, + } = (*state).clone() + { + info!("Card clicked: {}", card); + match playing_deal.play(card) { + Err(err) => error!("Could not play card: {:?}", err), + Ok(PlayingDealResult::InProgress(playing_deal)) => state.set(GameState::Play { + playing_deal, + contract, + bidding, + }), + Ok(PlayingDealResult::PlayFinished(tricks)) => todo!(), + }; + } + }) + }; let center = match &*state { GameState::Bidding { dealer, deal } => { @@ -87,9 +108,7 @@ pub fn game() -> Html { <Bidding {on_contract} dealer={dealer.clone()} /> } } - GameState::Play { - .. - } => html! { <p>{ "Time to play" }</p> }, + GameState::Play { .. } => html! { <p>{ "Time to play" }</p> }, GameState::PassedOut { .. } => html! { <p>{ "Everyone passed" }</p> }, }; |