diff options
Diffstat (limited to 'webapp/src/components/game.rs')
-rw-r--r-- | webapp/src/components/game.rs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/webapp/src/components/game.rs b/webapp/src/components/game.rs new file mode 100644 index 0000000..d31433d --- /dev/null +++ b/webapp/src/components/game.rs @@ -0,0 +1,68 @@ +use crate::bridge_engine::{self, Contract, Player}; +use crate::card; +use crate::card::Suit; +use crate::components::{Bidding, Hand, HandProps}; +use yew::prelude::*; + +pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade]; + +#[function_component(Game)] +pub fn game() -> Html { + let mut rng = rand::thread_rng(); + let mut deal = card::deal(&mut rng); + deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending); + + let north = use_state(|| HandProps::from_iter(deal.north.into_iter())); + let west = use_state(|| HandProps::from_iter(deal.west.into_iter())); + let south = use_state(|| HandProps::from_iter(deal.south.into_iter())); + let east = use_state(|| HandProps::from_iter(deal.east.into_iter())); + + let dealer = use_state(|| Player::East); + + let contract: UseStateHandle<Option<(Contract, bridge_engine::Bidding)>> = use_state(|| None); + let on_contract = { + let contract = contract.clone(); + Callback::from(move |c| contract.set(Some(c))) + }; + + let shuffle = { + let north = north.clone(); + let west = west.clone(); + let south = south.clone(); + let east = east.clone(); + let dealer = dealer.clone(); + + Callback::from(move |_| { + let mut rng = rand::thread_rng(); + let mut deal = card::deal(&mut rng); + deal.sort(&SUIT_DISPLAY_ORDER, card::RankOrder::Descending); + north.set(deal.north.into_iter().collect()); + west.set(deal.west.into_iter().collect()); + south.set(deal.south.into_iter().collect()); + east.set(deal.east.into_iter().collect()); + + dealer.set(dealer.next()); + }) + }; + + html! { + <> + <p>{ format!("Dealer: {:?}", *dealer) }</p> + if let Some((contract, bidding)) = &*contract { + { format!("Got contract {:?}. Bidding was {:?}", contract, bidding) } + } else { + <Bidding {on_contract} dealer={ *dealer } /> + } + <p>{ "North" }</p> + <Hand ..(*north).clone() /> + <p>{ "West" }</p> + <Hand ..(*west).clone() /> + <p>{ "South" }</p> + <Hand ..(*south).clone() /> + <p>{ "East" }</p> + <Hand ..(*east).clone() /> + <p>{ "Controls" }</p> + <button onclick={shuffle}>{ "Shuffle" }</button> + </> + } +} |