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(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::(".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 }