diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-09-11 13:03:36 -0400 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-09-11 13:03:36 -0400 |
commit | 435272c941d6cb8e7e18312cac16e319b16e8f50 (patch) | |
tree | 3da95e1e2e2d90c883d07b3185d49654fdd590de | |
parent | 9656f8ce14360dc0eb83e2b65ed25eef79c02e42 (diff) |
Add card callbacks
-rw-r--r-- | webapp/src/components/card.rs | 26 | ||||
-rw-r--r-- | webapp/src/components/game.rs | 23 | ||||
-rw-r--r-- | webapp/src/components/hand.rs | 30 |
3 files changed, 40 insertions, 39 deletions
diff --git a/webapp/src/components/card.rs b/webapp/src/components/card.rs index 6fbe7e7..5401899 100644 --- a/webapp/src/components/card.rs +++ b/webapp/src/components/card.rs @@ -1,13 +1,21 @@ use yew::prelude::*; -use crate::card::{self, Suit, Rank}; +use crate::card; use crate::components::suit_css_class; #[function_component(Card)] pub fn ccard(props: &CardProps) -> Html { + let card::Card(suit, rank) = props.card; + + let onclick = { + let card = props.card.clone(); + let onclick = props.onclick.clone(); + Callback::from(move |_| onclick.emit(card)) + }; + html! { - <div class="card"> - <div class={ suit_css_class(props.suit) }> - { props.rank } + <div class="card" {onclick}> + <div class={ suit_css_class(suit) }> + { rank } </div> </div> } @@ -15,12 +23,6 @@ pub fn ccard(props: &CardProps) -> Html { #[derive(PartialEq, Properties, Clone)] pub struct CardProps { - pub suit: Suit, - pub rank: Rank, -} - -impl From<card::Card> for CardProps { - fn from(card::Card(suit, rank): card::Card) -> Self { - CardProps { suit, rank } - } + pub card: card::Card, + pub onclick: Callback<card::Card>, } diff --git a/webapp/src/components/game.rs b/webapp/src/components/game.rs index 1544f13..d6341ac 100644 --- a/webapp/src/components/game.rs +++ b/webapp/src/components/game.rs @@ -1,7 +1,8 @@ use crate::bridge_engine::{self, Contract, Player}; use crate::card; use crate::card::Suit; -use crate::components::{Bidding, Hand, HandProps, ShowBid}; +use crate::components::{Bidding, Hand, ShowBid}; +use log::info; use yew::prelude::*; pub const SUIT_DISPLAY_ORDER: [Suit; 4] = [Suit::Diamond, Suit::Club, Suit::Heart, Suit::Spade]; @@ -55,6 +56,8 @@ pub fn game() -> Html { }) }; + let on_card_clicked = { Callback::from(move |card| info!("Card clicked: {}", card)) }; + html! { <> <div class="nav"> @@ -67,22 +70,30 @@ pub fn game() -> Html { <div class="center"> <p>{ format!("Dealer: {:?}", *dealer) }</p> if let Some(_) = &*contract { - { "Let's play" } + { "Let's play." } } else { <Bidding {on_contract} dealer={ *dealer } /> } </div> <div class="hand west"> - <Hand ..{ dealt_cards.west.clone().into_iter().collect() }/> + <Hand cards={ dealt_cards.west.clone() } + on_card_clicked={ on_card_clicked.clone() } + /> </div> <div class="hand north"> - <Hand ..{ dealt_cards.north.clone().into_iter().collect() }/> + <Hand cards={ dealt_cards.north.clone() } + on_card_clicked={ on_card_clicked.clone() } + /> </div> <div class="hand east"> - <Hand ..{ dealt_cards.east.clone().into_iter().collect() }/> + <Hand cards={ dealt_cards.east.clone() } + on_card_clicked={ on_card_clicked.clone() } + /> </div> <div class="hand south"> - <Hand ..{ dealt_cards.south.clone().into_iter().collect() }/> + <Hand cards={ dealt_cards.south.clone() } + on_card_clicked={ on_card_clicked.clone() } + /> </div> </> } diff --git a/webapp/src/components/hand.rs b/webapp/src/components/hand.rs index bb6e372..9e1f993 100644 --- a/webapp/src/components/hand.rs +++ b/webapp/src/components/hand.rs @@ -1,16 +1,14 @@ -use yew::prelude::*; use crate::components::card::{Card, CardProps}; +use crate::card; +use yew::prelude::*; #[function_component(Hand)] pub fn hand(props: &HandProps) -> Html { - let cards = props - .cards - .iter() - .map(|c| { - html! { - <Card ..c.clone() /> - } - }); + let cards = props.cards.iter().map(|card| { + html! { + <Card card={ card.clone() } onclick={ props.on_card_clicked.clone() } /> + } + }); html! { { for cards } @@ -20,16 +18,6 @@ pub fn hand(props: &HandProps) -> Html { #[derive(Clone, Default, PartialEq, Properties)] pub struct HandProps { #[prop_or_default] - pub cards: Vec<CardProps>, -} - -impl<C: Into<CardProps>> FromIterator<C> for HandProps { - fn from_iter<Cards>(cards: Cards) -> Self - where - Cards: std::iter::IntoIterator<Item = C>, - { - HandProps { - cards: cards.into_iter().map(Into::into).collect(), - } - } + pub cards: Vec<card::Card>, + pub on_card_clicked: Callback<card::Card>, } |