From cab440c8a209ae92eba07d50f7b7127dadbd65c0 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Tue, 6 Sep 2022 22:07:28 -0400 Subject: Move components to a separate module --- webapp/src/components/bidding_box.rs | 37 ++++++++++++++++++++++++++ webapp/src/components/bidding_table.rs | 48 ++++++++++++++++++++++++++++++++++ webapp/src/components/card.rs | 26 ++++++++++++++++++ webapp/src/components/hand.rs | 38 +++++++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 webapp/src/components/bidding_box.rs create mode 100644 webapp/src/components/bidding_table.rs create mode 100644 webapp/src/components/card.rs create mode 100644 webapp/src/components/hand.rs (limited to 'webapp/src/components') diff --git a/webapp/src/components/bidding_box.rs b/webapp/src/components/bidding_box.rs new file mode 100644 index 0000000..38a543f --- /dev/null +++ b/webapp/src/components/bidding_box.rs @@ -0,0 +1,37 @@ +use yew::prelude::*; +use crate::bridge_engine::Raise; +use crate::components::bid_css_class; + +#[function_component(BiddingBox)] +pub fn bidding_box(props: &BiddingBoxProps) -> Html { + let bids: Html = Raise::all_raises() + .iter() + .map(|bid| { + let mut class = if Some(*bid) <= props.current_bid { + classes!("disabled") + } else { + classes!("enabled") + }; + class.extend(classes!(bid_css_class(bid.suit))); + html! { +
+ { bid.level } +
+ } + }) + .collect(); + + html! { +
+ { bids } +
{ "Pass" }
+
{ "X" }
+
{ "XX" }
+
+ } +} + +#[derive(PartialEq, Properties, Clone)] +pub struct BiddingBoxProps { + pub current_bid: Option, +} 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!{
{ bid }
}, + Some(raise) => html!{ +
+ { raise.level } +
+
+ }, + }; + let bids: Html = props + .bidding + .bids + .iter() + .map(|b| { bid(b) }) + .collect(); + let padding : Html = padding(props.bidding.dealer); + html! { +
+
{ "West" }
+
{ "North" }
+
{ "East" }
+
{ "South" }
+ { padding } + { bids } +
+ } +} + +fn padding(dealer: Player) -> Html { + let mut padding : Vec = vec![]; + let mut player = Player::West; + while player != dealer { + padding.push(html! {
}); + player = player.next(); + } + padding.into_iter().collect() +} + +#[derive(PartialEq, Properties, Clone)] +pub struct BiddingTableProps { + pub bidding: Bidding, +} diff --git a/webapp/src/components/card.rs b/webapp/src/components/card.rs new file mode 100644 index 0000000..6fbe7e7 --- /dev/null +++ b/webapp/src/components/card.rs @@ -0,0 +1,26 @@ +use yew::prelude::*; +use crate::card::{self, Suit, Rank}; +use crate::components::suit_css_class; + +#[function_component(Card)] +pub fn ccard(props: &CardProps) -> Html { + html! { +
+
+ { props.rank } +
+
+ } +} + +#[derive(PartialEq, Properties, Clone)] +pub struct CardProps { + pub suit: Suit, + pub rank: Rank, +} + +impl From for CardProps { + fn from(card::Card(suit, rank): card::Card) -> Self { + CardProps { suit, rank } + } +} diff --git a/webapp/src/components/hand.rs b/webapp/src/components/hand.rs new file mode 100644 index 0000000..1a2727c --- /dev/null +++ b/webapp/src/components/hand.rs @@ -0,0 +1,38 @@ +use yew::prelude::*; +use crate::components::card::{Card, CardProps}; + +#[function_component(Hand)] +pub fn hand(props: &HandProps) -> Html { + let cards: Html = props + .cards + .iter() + .map(|c| { + html! { + + } + }) + .collect(); + + html! { +
+ { cards } +
+ } +} + +#[derive(Clone, Default, PartialEq, Properties)] +pub struct HandProps { + #[prop_or_default] + cards: Vec, +} + +impl> FromIterator for HandProps { + fn from_iter(cards: Cards) -> Self + where + Cards: std::iter::IntoIterator, + { + HandProps { + cards: cards.into_iter().map(Into::into).collect(), + } + } +} -- cgit v1.2.3