summaryrefslogtreecommitdiff
path: root/webapp/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/src/components')
-rw-r--r--webapp/src/components/bidding.rs51
-rw-r--r--webapp/src/components/bidding_box.rs36
2 files changed, 73 insertions, 14 deletions
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>,
}