use crate::class::Class;
use dioxus::prelude::*;
use std::time::Duration;
use zino_core::SharedString;
pub fn Notification(props: NotificationProps) -> Element {
let mut hidden = use_signal(|| props.hidden);
if props.duration > 0 {
spawn(async move {
tokio::time::sleep(Duration::from_millis(props.duration)).await;
hidden.set(true);
});
}
if hidden() {
return rsx! {};
}
rsx! {
div {
class: "{props.class}",
class: if !props.color.is_empty() { "is-{props.color}" },
class: if !props.theme.is_empty() { "is-{props.theme}" },
position: "fixed",
top: "4rem",
right: "0.75rem",
z_index: 99,
if props.on_close.is_some() {
button {
r#type: "button",
class: props.close_class,
onclick: move |event| {
if let Some(handler) = props.on_close.as_ref() {
handler.call(event);
}
}
}
}
{ props.children }
}
}
}
#[derive(Clone, PartialEq, Props)]
pub struct NotificationProps {
#[props(into, default = "notification")]
pub class: Class,
#[props(into, default = "delete")]
pub close_class: Class,
#[props(into, default)]
pub color: SharedString,
#[props(into, default)]
pub theme: SharedString,
pub on_close: Option<EventHandler<MouseEvent>>,
#[props(default)]
pub hidden: bool,
#[props(default = 3000)]
pub duration: u64,
children: Element,
}