summaryrefslogtreecommitdiff
path: root/webapp/src/components/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/src/components/game.rs')
-rw-r--r--webapp/src/components/game.rs68
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>
+ </>
+ }
+}