Skip to main content

dioxus_bulma/components/
notification.rs

1use dioxus::prelude::*;
2use crate::theme::BulmaColor;
3use crate::utils::build_class;
4
5#[derive(Props, Clone, PartialEq)]
6pub struct NotificationProps {
7    #[props(default)]
8    pub color: Option<BulmaColor>,
9    #[props(default)]
10    pub light: Option<bool>,
11    #[props(default)]
12    pub dismissible: Option<bool>,
13    #[props(default)]
14    pub onclose: Option<EventHandler<MouseEvent>>,
15    #[props(default)]
16    pub id: Option<String>,
17    #[props(default)]
18    pub class: Option<String>,
19    #[props(default)]
20    pub style: Option<String>,
21    pub children: Element,
22}
23
24#[component]
25pub fn Notification(props: NotificationProps) -> Element {
26    let color = props.color.unwrap_or(BulmaColor::Primary);
27    let light = props.light.unwrap_or(false);
28    let dismissible = props.dismissible.unwrap_or(false);
29    
30    let base_classes = vec!["notification"];
31    
32    let optional_classes = vec![
33        Some(format!("is-{}", color.as_str())),
34        if light { Some("is-light".to_string()) } else { None },
35        props.class.clone(),
36    ];
37    
38    let final_class = build_class(&base_classes, &optional_classes);
39    let notification_style = props.style.as_deref().unwrap_or("");
40
41    rsx! {
42        div {
43            class: "{final_class}",
44            style: "{notification_style}",
45            id: props.id.clone(),
46            if dismissible {
47                button {
48                    class: "delete",
49                    onclick: move |evt| {
50                        if let Some(handler) = &props.onclose {
51                            handler.call(evt);
52                        }
53                    }
54                }
55            }
56            {props.children}
57        }
58    }
59}