Skip to main content

dao_ui/components/button_icon/
button_icon.rs

1use css_in_rust::Style;
2use yew::{
3  html, Component, ShouldRender, Html, ComponentLink,
4  Properties, Children, Classes,
5};
6use crate::theme::{Theme};
7
8#[derive(Clone, PartialEq, Debug)]
9#[allow(dead_code)]
10pub enum ButtonIconSize {
11  Small,
12  Medium,
13  Large,
14}
15
16#[derive(Clone, PartialEq, Debug)]
17#[allow(dead_code)]
18pub enum ButtonIconPosition {
19  Start,
20  End,
21}
22
23pub struct ButtonIcon {
24  style: Style,
25  props: Props,
26}
27
28#[derive(Properties, Clone, PartialEq, Debug)]
29pub struct Props {
30    #[prop_or_default]
31    pub class: String,
32    #[prop_or_default]
33    pub children: Children,
34    #[prop_or(ButtonIconSize::Medium)]
35    pub size: ButtonIconSize,
36    #[prop_or(ButtonIconPosition::Start)]
37    pub position: ButtonIconPosition,
38}
39
40fn get_size_class(size: &ButtonIconSize) -> String {
41  let s = match size {
42    ButtonIconSize::Small => { "small" }
43    ButtonIconSize::Medium => { "medium" }
44    ButtonIconSize::Large => { "large" }
45  };
46
47  format!("size-{}", s)
48}
49
50fn get_position_class(size: &ButtonIconPosition) -> String {
51  let s = match size {
52    ButtonIconPosition::Start => { "start" }
53    ButtonIconPosition::End => { "end" }
54  };
55
56  format!("position-{}", s)
57}
58
59impl Component for ButtonIcon {
60  type Message = ();
61  type Properties = Props;
62
63  fn create(props: Self::Properties, _link: ComponentLink<Self>) -> Self {
64    let theme = Theme::default();
65    let style = Style::create(
66      String::from("button_icon"),
67      include_str!("button_icon.scss")
68        .replace("$breakpoint_md", &theme.breakpoints.md.to_string())
69        .replace("$palette_divider", &theme.palette.divider),
70    )
71    .expect("An error occured while creating the style");
72
73    Self {
74      style,
75      props,
76    }
77  }
78
79  fn update(&mut self, _msg: Self::Message) -> ShouldRender {
80    false
81  }
82
83  fn change(&mut self, props: Self::Properties) -> ShouldRender {
84    if self.props != props {
85      self.props = props;
86      
87      true
88    } else {
89      false
90    }
91  }
92
93  fn view(&self) -> Html {
94    let class = self.format_classes();
95
96    html! {
97      <div
98        class=class
99      >
100        {self.props.children.clone()}
101      </div>
102    }
103  }
104}
105
106impl ButtonIcon {
107  fn format_classes(&self) -> Classes {
108    let mut classes = Classes::from(self.style.clone().to_string());
109
110    classes.push(self.props.class.clone());
111    classes.push(get_size_class(&self.props.size));
112    classes.push(get_position_class(&self.props.position));
113
114    classes
115  }
116}