recipes/frontend/src/modal_dialog.rs

53 lines
1.3 KiB
Rust

use futures::{future::FutureExt, pin_mut, select};
use web_sys::{Element, HtmlDialogElement};
use crate::{
on_click,
utils::{by_id, selector_and_clone, SelectorExt},
};
pub enum DialogContent<'a, T>
where
T: Fn(&Element),
{
Text(&'a str),
CloneFromElement(&'a str, T),
}
pub async fn show<T>(content: DialogContent<'_, T>) -> bool
where
T: Fn(&Element),
{
let dialog: HtmlDialogElement = by_id("modal-dialog");
let input_ok: Element = dialog.selector(".ok");
let input_cancel: Element = dialog.selector(".cancel");
let content_element = dialog.selector::<Element>(".content");
match content {
DialogContent::Text(message) => content_element.set_inner_html(message),
DialogContent::CloneFromElement(element_selector, initilizer) => {
let element: Element = selector_and_clone(element_selector);
content_element.set_inner_html("");
content_element.append_child(&element).unwrap();
initilizer(&element);
}
}
dialog.show_modal().unwrap();
let click_ok = on_click::OnClick::new(&input_ok).fuse();
let click_cancel = on_click::OnClick::new(&input_cancel).fuse();
pin_mut!(click_ok, click_cancel);
let result = select! {
() = click_ok => true,
() = click_cancel => false,
};
dialog.close();
result
}