From d66f16ae60190eebe711f7f2fb931513d711cd32 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Thu, 22 Sep 2022 06:58:59 -0400 Subject: Allow card play in game component --- webapp/src/components/game.rs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'webapp') 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 { } } - GameState::Play { - .. - } => html! {

{ "Time to play" }

}, + GameState::Play { .. } => html! {

{ "Time to play" }

}, GameState::PassedOut { .. } => html! {

{ "Everyone passed" }

}, }; -- cgit v1.2.3