diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-09-06 22:07:28 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-09-06 22:07:28 -0400 |
commit | cab440c8a209ae92eba07d50f7b7127dadbd65c0 (patch) | |
tree | 95ad002ad00b6ae99baeb410cc23195286cf5d45 /webapp/src/components/bidding_table.rs | |
parent | 77ed77bfa3480a06a3f36b072af5eb8712a1515c (diff) |
Move components to a separate module
Diffstat (limited to 'webapp/src/components/bidding_table.rs')
-rw-r--r-- | webapp/src/components/bidding_table.rs | 48 |
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, +} |