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! {
{ "Everyone passed" }
}, }; html! { <>