From 865a3eb1066f5bb140a6ce603e1162460a336934 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Wed, 7 Sep 2022 09:54:27 -0400 Subject: Add interactive bidding component --- webapp/src/components.rs | 2 ++ webapp/src/components/bidding.rs | 51 ++++++++++++++++++++++++++++++++++++ webapp/src/components/bidding_box.rs | 36 +++++++++++++++---------- webapp/src/main.rs | 7 ++--- 4 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 webapp/src/components/bidding.rs (limited to 'webapp/src') diff --git a/webapp/src/components.rs b/webapp/src/components.rs index fed31b0..e13d372 100644 --- a/webapp/src/components.rs +++ b/webapp/src/components.rs @@ -4,10 +4,12 @@ mod card; mod hand; mod bidding_table; mod bidding_box; +mod bidding; pub use self::card::*; pub use self::bidding_box::*; pub use self::bidding_table::*; +pub use self::bidding::*; pub use self::hand::*; pub fn suit_css_class(suit: Suit) -> &'static str { diff --git a/webapp/src/components/bidding.rs b/webapp/src/components/bidding.rs new file mode 100644 index 0000000..50ff72f --- /dev/null +++ b/webapp/src/components/bidding.rs @@ -0,0 +1,51 @@ +use crate::bridge_engine::{self, Bid, BiddingResult, Player}; +use crate::components::{BiddingBox, BiddingTable}; +use log::info; +use yew::prelude::*; + +#[derive(Debug)] +pub enum Msg { + Bid(Bid), +} + +pub struct Bidding { + bidding: BiddingResult, +} + +#[derive(PartialEq, Properties)] +pub struct BiddingProperties { + pub dealer: Player, +} + +impl Component for Bidding { + type Message = Msg; + type Properties = BiddingProperties; + + fn create(ctx: &Context) -> Self { + Self { + bidding: BiddingResult::new(ctx.props().dealer), + } + } + + fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { + match msg { + Msg::Bid(bid) => { + self.bidding = self.bidding.bidding().clone().bid(bid).unwrap(); + true + } + } + } + + fn view(&self, ctx: &Context) -> Html { + html! { + <> +

{ "Bidding table" }

+ +

{ "Bidding box" }

+ + + } + } +} diff --git a/webapp/src/components/bidding_box.rs b/webapp/src/components/bidding_box.rs index 38a543f..04f82f9 100644 --- a/webapp/src/components/bidding_box.rs +++ b/webapp/src/components/bidding_box.rs @@ -1,32 +1,39 @@ use yew::prelude::*; -use crate::bridge_engine::Raise; +use crate::bridge_engine::{Bid, 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 { + let bids = Raise::all_raises() + .into_iter() + .map(|raise| { + let mut class = if Some(raise) <= props.current_bid { classes!("disabled") } else { classes!("enabled") }; - class.extend(classes!(bid_css_class(bid.suit))); + class.extend(classes!(bid_css_class(raise.suit))); + let onclick = { + let on_bid = props.on_bid.clone(); + Callback::from(move |_| on_bid.emit(Bid::Raise(raise))) + }; html! { -
- { bid.level } +
+ { raise.level }
} - }) - .collect(); + }); + let onclick = |bid| { + let on_bid = props.on_bid.clone(); + Callback::from(move |_| on_bid.emit(bid)) + }; html! {
- { bids } -
{ "Pass" }
-
{ "X" }
-
{ "XX" }
+ { for bids } +
{ "Pass" }
+
{ "X" }
+
{ "XX" }
} } @@ -34,4 +41,5 @@ pub fn bidding_box(props: &BiddingBoxProps) -> Html { #[derive(PartialEq, Properties, Clone)] pub struct BiddingBoxProps { pub current_bid: Option, + pub on_bid: Callback, } diff --git a/webapp/src/main.rs b/webapp/src/main.rs index 8f94899..be02013 100644 --- a/webapp/src/main.rs +++ b/webapp/src/main.rs @@ -6,7 +6,7 @@ pub mod bridge_engine; pub mod card; pub mod components; use bridge_engine::{Player, BiddingResult}; -use components::{BiddingTable, BiddingBox, Hand, HandProps}; +use components::{Bidding, Hand, HandProps}; extern crate wee_alloc; // Use `wee_alloc` as the global allocator. @@ -53,10 +53,7 @@ pub fn app() -> Html { html! { <> -

{ "Bidding table" }

- -

{ "Bidding box" }

- +

{ "North" }

{ "West" }

-- cgit v1.2.3