dao_ui/components/button_icon/
button_icon.rs1use 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}