yew_bs/components/
alert.rs1use 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}