yew_bs/components/
alert.rs

1use yew::prelude::*;
2use web_sys::Element;
3use crate::components::common::Variant;
4use crate::interop::BsAlert;
5#[derive(Properties, PartialEq)]
6pub struct AlertProps {
7    #[prop_or_default]
8    pub children: Children,
9    #[prop_or(Variant::Primary)]
10    pub variant: Variant,
11    #[prop_or_default]
12    pub dismissible: bool,
13    #[prop_or_default]
14    pub on_close: Option<Callback<()>>,
15    #[prop_or_default]
16    pub class: Option<AttrValue>,
17    #[prop_or_default]
18    pub node_ref: NodeRef,
19}
20#[function_component(Alert)]
21pub fn alert(props: &AlertProps) -> Html {
22    let mut classes = Classes::new();
23    classes.push("alert");
24    classes.push(format!("alert-{}", props.variant.as_str()));
25    if props.dismissible {
26        classes.push("alert-dismissible");
27    }
28    if let Some(class) = &props.class {
29        classes.push(class.to_string());
30    }
31    let on_close = props.on_close.clone();
32    let node_ref = props.node_ref.clone();
33    let close_button_onclick = Callback::from(move |e: MouseEvent| {
34        e.prevent_default();
35        if let Some(element) = node_ref.cast::<Element>() {
36            let bs_alert = BsAlert::new(&element);
37            bs_alert.close();
38        }
39        if let Some(on_close) = on_close.as_ref() {
40            on_close.emit(());
41        }
42    });
43    html! {
44        < div class = { classes } role = "alert" ref = { props.node_ref.clone() } > { for
45        props.children.iter() } if props.dismissible { < button type = "button" class =
46        "btn-close" data - bs - dismiss = "alert" aria - label = "Close" onclick = {
47        close_button_onclick } /> } </ div >
48    }
49}