use super::*;
#[component]
pub fn euv_popconfirm(node: VirtualNode<EuvPopconfirmProps>) -> VirtualNode {
let EuvPopconfirmProps {
title,
ok_label,
cancel_label,
on_ok,
on_cancel,
}: EuvPopconfirmProps = node.try_get_props().unwrap_or_default();
let children: VirtualNode = node.get_children().into();
let open: Signal<bool> = HookContext::use_hook(|| Signal::create(false));
let has_ok: bool = !ok_label.is_empty();
let has_cancel: bool = !cancel_label.is_empty();
let toggle_handler: Option<Rc<dyn Fn(Event)>> = popconfirm_toggle_handler(open);
let ok_handler: Rc<dyn Fn(Event)> = popconfirm_ok_handler(on_ok, open);
let cancel_handler: Rc<dyn Fn(Event)> = popconfirm_cancel_handler(on_cancel, open);
html! {
div {
class: c_euv_popconfirm()
span {
onclick: toggle_handler
children
}
div {
class: c_euv_popconfirm_body()
class: if { open } {
c_euv_popconfirm_body_open()
} else {
c_euv_popconfirm_body_closed()
}
div {
class: c_euv_popconfirm_text()
title
}
div {
class: c_euv_popconfirm_actions()
if has_ok {
euv_button {
variant: EuvButtonVariant::Primary
label: ok_label
onclick: Some(ok_handler)
}
}
if has_cancel {
euv_button {
variant: EuvButtonVariant::Outline
label: cancel_label
onclick: Some(cancel_handler)
}
}
}
}
}
}
}
pub fn popconfirm_toggle_handler<E: 'static>(open: Signal<bool>) -> Option<Rc<dyn Fn(E)>> {
Some(Rc::new(move |_: E| {
let is_open: bool = open.get();
open.set(!is_open);
}))
}
pub fn popconfirm_ok_handler<E: 'static>(
on_ok: Option<Rc<dyn Fn()>>,
open: Signal<bool>,
) -> Rc<dyn Fn(E)> {
Rc::new(move |_: E| {
if let Some(callback) = &on_ok {
callback();
}
open.set(false);
})
}
pub fn popconfirm_cancel_handler<E: 'static>(
on_cancel: Option<Rc<dyn Fn()>>,
open: Signal<bool>,
) -> Rc<dyn Fn(E)> {
Rc::new(move |_: E| {
if let Some(callback) = &on_cancel {
callback();
}
open.set(false);
})
}