use super::*;
#[component]
pub fn euv_message(node: VirtualNode<EuvMessageProps>) -> VirtualNode {
let EuvMessageProps { items }: EuvMessageProps = node.try_get_props().unwrap_or_default();
let messages: Vec<VirtualNode> = items
.into_iter()
.enumerate()
.map(
|(index, item): (usize, message::view::r#struct::EuvMessageItem)| {
euv_message_item(index, item)
},
)
.collect();
html! {
div {
class: c_euv_message_stack()
messages
}
}
}
fn euv_message_item(index: usize, item: EuvMessageItem) -> VirtualNode {
let EuvMessageItem {
text,
action_label,
on_action,
on_close,
dismissible,
}: EuvMessageItem = item;
let has_action: bool = !action_label.is_empty();
let is_dismissible: bool = dismissible || on_close.is_some();
let action_handler: Option<Rc<dyn Fn(Event)>> = message_callback_handler(on_action);
let close_handler: Option<Rc<dyn Fn(Event)>> = message_callback_handler(on_close);
html! {
div {
key: index.to_string()
class: c_euv_message()
div {
class: c_euv_message_text()
text
}
if has_action {
button {
class: c_euv_message_action()
onclick: action_handler
action_label
}
}
if is_dismissible {
button {
class: c_euv_message_close()
onclick: close_handler
"×"
}
}
}
}
}
pub fn message_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();
})
})
}