use dioxus::prelude::*;
use crate::types::Color;
#[derive(Clone, PartialEq, Props)]
pub struct AlertProps {
#[props(default = Color::Primary)]
pub color: Color,
#[props(default)]
pub dismissible: bool,
#[props(default)]
pub on_dismiss: Option<EventHandler<()>>,
#[props(default)]
pub class: String,
#[props(extends = GlobalAttributes)]
attributes: Vec<Attribute>,
pub children: Element,
}
#[component]
pub fn Alert(props: AlertProps) -> Element {
let mut visible = use_signal(|| true);
if !*visible.read() {
return rsx! {};
}
let dismiss_class = if props.dismissible {
" alert-dismissible fade show"
} else {
""
};
let full_class = if props.class.is_empty() {
format!("alert alert-{}{dismiss_class}", props.color)
} else {
format!("alert alert-{}{dismiss_class} {}", props.color, props.class)
};
rsx! {
div {
class: "{full_class}",
role: "alert",
..props.attributes,
{props.children}
if props.dismissible {
button {
class: "btn-close",
r#type: "button",
"aria-label": "Close",
onclick: move |_| {
visible.set(false);
if let Some(handler) = &props.on_dismiss {
handler.call(());
}
},
}
}
}
}
}