summaryrefslogtreecommitdiff
path: root/webapp
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-09-22 06:58:59 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-09-22 06:58:59 -0400
commitd66f16ae60190eebe711f7f2fb931513d711cd32 (patch)
tree132a04b47a213002d7247f3f4f7a69221b871327 /webapp
parent1d13f53d8dd72921bb6e05839ef125061b567be8 (diff)
Allow card play in game component
Diffstat (limited to 'webapp')
-rw-r--r--webapp/src/components/game.rs33
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> },
};