use super::*;
#[component]
pub fn euv_notification(node: VirtualNode<EuvNotificationProps>) -> VirtualNode {
let EuvNotificationProps { items }: EuvNotificationProps =
node.try_get_props().unwrap_or_default();
let notifications: Vec<VirtualNode> = items
.into_iter()
.enumerate()
.map(
|(index, item): (usize, notification::view::r#struct::EuvNotificationItem)| {
euv_notification_item(index, item)
},
)
.collect();
html! {
div {
class: c_euv_notification_stack()
notifications
}
}
}
fn euv_notification_item(index: usize, item: EuvNotificationItem) -> VirtualNode {
let EuvNotificationItem {
title,
text,
on_close,
dismissible,
}: EuvNotificationItem = item;
let is_dismissible: bool = dismissible || on_close.is_some();
let close_handler: Option<Rc<dyn Fn(Event)>> = notification_callback_handler(on_close);
html! {
div {
key: index.to_string()
class: c_euv_notification()
div {
class: c_euv_notification_body()
div {
class: c_euv_notification_title()
title
}
div {
class: c_euv_notification_text()
text
}
}
if is_dismissible {
button {
class: c_euv_notification_close()
onclick: close_handler
"×"
}
}
}
}
}
pub fn notification_callback_handler<E: 'static>(
callback: Option<Rc<dyn Fn()>>,
) -> Option<Rc<dyn Fn(E)>> {
callback.map(|handler: Rc<dyn Fn()>| -> Rc<dyn Fn(E)> {
Rc::new(move |_: E| {
handler();
})
})
}