use crate::components::{Bidding, Hand, ShowBid, TrickInPlay, TricksPlayed}; use log::{error, info}; use protocol::bridge_engine::{ BiddingState, DealInPlay, DealInPlayResult, GameState, PlayState, Player, }; use rand::random; use yew::prelude::*; fn init_state() -> GameState { GameState::new(random(), Player::East) } #[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(PlayState { dealer, playing_deal, contract, bidding, deal, .. }) = (*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(PlayState { dealer, playing_deal, contract, bidding, deal, })) } Ok(DealInPlayResult::PlayFinished(_tricks)) => todo!(), }; } }) }; let center = match &*state { GameState::Bidding(BiddingState { dealer, deal, bidding, }) => { 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(PlayState { dealer, deal: deal.clone(), playing_deal: DealInPlay::new(dealer, deal.clone()), contract, bidding, }), None => GameState::PassedOut { dealer: dealer, deal: deal.clone(), bidding: bidding, }, }); }) }; html! { } } GameState::Play(PlayState { deal, dealer, playing_deal, contract: _, bidding: _, }) => { html! { <> } } GameState::PassedOut { .. } => html! {

{ "Everyone passed" }

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