summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-09-07 09:54:27 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-09-07 09:54:27 -0400
commit865a3eb1066f5bb140a6ce603e1162460a336934 (patch)
tree6ce0959e53ab17dfdb109b6dd62c6a0033b0ae63
parentcab440c8a209ae92eba07d50f7b7127dadbd65c0 (diff)
Add interactive bidding component
-rw-r--r--webapp/src/components.rs2
-rw-r--r--webapp/src/components/bidding.rs51
-rw-r--r--webapp/src/components/bidding_box.rs36
-rw-r--r--webapp/src/main.rs7
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>