summaryrefslogtreecommitdiff
path: root/webapp/src/components/bidding_table.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-09-06 22:07:28 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-09-06 22:07:28 -0400
commitcab440c8a209ae92eba07d50f7b7127dadbd65c0 (patch)
tree95ad002ad00b6ae99baeb410cc23195286cf5d45 /webapp/src/components/bidding_table.rs
parent77ed77bfa3480a06a3f36b072af5eb8712a1515c (diff)
Move components to a separate module
Diffstat (limited to 'webapp/src/components/bidding_table.rs')
-rw-r--r--webapp/src/components/bidding_table.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/webapp/src/components/bidding_table.rs b/webapp/src/components/bidding_table.rs
new file mode 100644
index 0000000..f4b692a
--- /dev/null
+++ b/webapp/src/components/bidding_table.rs
@@ -0,0 +1,48 @@
+use yew::prelude::*;
+use crate::bridge_engine::{Bid, Bidding, Player};
+use crate::components::bid_css_class;
+
+#[function_component(BiddingTable)]
+pub fn bidding_table(props: &BiddingTableProps) -> Html {
+ let bid = |bid: &Bid| match bid.as_raise() {
+ None => html!{ <div class="bid">{ bid }</div> },
+ Some(raise) => html!{
+ <div class="bid">
+ { raise.level }
+ <div class={ bid_css_class(raise.suit) }/>
+ </div>
+ },
+ };
+ let bids: Html = props
+ .bidding
+ .bids
+ .iter()
+ .map(|b| { bid(b) })
+ .collect();
+ let padding : Html = padding(props.bidding.dealer);
+ html! {
+ <div class="bidding-table">
+ <div class="header">{ "West" }</div>
+ <div class="header">{ "North" }</div>
+ <div class="header">{ "East" }</div>
+ <div class="header">{ "South" }</div>
+ { padding }
+ { bids }
+ </div>
+ }
+}
+
+fn padding(dealer: Player) -> Html {
+ let mut padding : Vec<Html> = vec![];
+ let mut player = Player::West;
+ while player != dealer {
+ padding.push(html! { <div/> });
+ player = player.next();
+ }
+ padding.into_iter().collect()
+}
+
+#[derive(PartialEq, Properties, Clone)]
+pub struct BiddingTableProps {
+ pub bidding: Bidding,
+}