use protocol::bridge_engine::{DealInPlay, DealInPlayResult, Player, GameState, deal}; use crate::components::{Bidding, Hand, ShowBid, TrickInPlay, TricksPlayed}; use log::{error, info}; use yew::prelude::*; fn init_state() -> GameState { let dealer = Player::East; let deal = deal(); GameState::Bidding { dealer, deal } } #[function_component(Game)] pub fn game() -> Html { let state = use_state(|| init_state()); let shuffle = { let state = state.clone(); Callback::from(move |_| { state.set(init_state()); }) }; 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(DealInPlayResult::InProgress(playing_deal)) => state.set(GameState::Play { playing_deal, contract, bidding, }), Ok(DealInPlayResult::PlayFinished(_tricks)) => todo!(), }; } }) }; let center = match &*state { GameState::Bidding { dealer, deal } => { let on_contract = { let state = state.clone(); let dealer = dealer.clone(); let deal = deal.clone(); Callback::from(move |(contract, bidding)| { state.set(match contract { Some(contract) => GameState::Play { playing_deal: DealInPlay::new(dealer, deal.clone()), contract, bidding, }, None => GameState::PassedOut { dealer: dealer, deal: deal.clone(), bidding: bidding, }, }); }) }; html! { } } GameState::Play { playing_deal, contract: _, bidding: _, } => { html! { <> } } GameState::PassedOut { .. } => html! {

{ "Everyone passed" }

}, }; html! { <>
{ center }
} }