diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-09-07 09:54:27 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-09-07 09:54:27 -0400 |
commit | 865a3eb1066f5bb140a6ce603e1162460a336934 (patch) | |
tree | 6ce0959e53ab17dfdb109b6dd62c6a0033b0ae63 | |
parent | cab440c8a209ae92eba07d50f7b7127dadbd65c0 (diff) |
Add interactive bidding component
-rw-r--r-- | webapp/src/components.rs | 2 | ||||
-rw-r--r-- | webapp/src/components/bidding.rs | 51 | ||||
-rw-r--r-- | webapp/src/components/bidding_box.rs | 36 | ||||
-rw-r--r-- | webapp/src/main.rs | 7 |
4 files changed, 77 insertions, 19 deletions
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 { + Self { + bidding: BiddingResult::new(ctx.props().dealer), + } + } + + fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool { + match msg { + Msg::Bid(bid) => { + self.bidding = self.bidding.bidding().clone().bid(bid).unwrap(); + true + } + } + } + + fn view(&self, ctx: &Context<Self>) -> Html { + html! { + <> + <p>{ "Bidding table" }</p> + <BiddingTable bidding={ self.bidding.bidding().clone() } /> + <p>{ "Bidding box" }</p> + <BiddingBox + current_bid={ self.bidding.bidding().highest_bid().clone() } + on_bid={ ctx.link().callback(|bid| Msg::Bid(bid)) } /> + </> + } + } +} 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! { - <div class={class}> - { bid.level } + <div class={class} {onclick}> + { raise.level } </div> } - }) - .collect(); + }); + let onclick = |bid| { + let on_bid = props.on_bid.clone(); + Callback::from(move |_| on_bid.emit(bid)) + }; html! { <div class="bidding-box"> - { bids } - <div>{ "Pass" }</div> - <div>{ "X" }</div> - <div>{ "XX" }</div> + { for bids } + <div onclick={ onclick(Bid::Pass) }>{ "Pass" }</div> + <div onclick={ onclick(Bid::Double) }>{ "X" }</div> + <div onclick={ onclick(Bid::Redouble) }>{ "XX" }</div> </div> } } @@ -34,4 +41,5 @@ pub fn bidding_box(props: &BiddingBoxProps) -> Html { #[derive(PartialEq, Properties, Clone)] pub struct BiddingBoxProps { pub current_bid: Option<Raise>, + pub on_bid: Callback<Bid>, } 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! { <> - <p>{ "Bidding table" }</p> - <BiddingTable bidding={ (*bidding_state).clone().bidding().clone() } /> - <p>{ "Bidding box" }</p> - <BiddingBox current_bid={ (*bidding_state).clone().bidding().highest_bid() } /> + <Bidding dealer={ Player::East } /> <p>{ "North" }</p> <Hand ..(*north).clone() /> <p>{ "West" }</p> |