recipes/frontend/src/toast.rs

46 lines
1.2 KiB
Rust

use gloo::{timers::callback::Timeout, utils::document};
use web_sys::Element;
use crate::utils::{by_id, selector_and_clone, SelectorExt};
pub enum Level {
Success,
Error,
Info,
Warning,
}
const TIME_DISPLAYED: u32 = 10_000; // [ms].
pub fn show_message(level: Level, message: &str) {
let toast_element = document().get_element_by_id("toast").unwrap();
toast_element.set_inner_html(message);
toast_element.set_class_name("show");
Timeout::new(TIME_DISPLAYED, move || {
toast_element.set_class_name("");
})
.forget();
}
pub fn show_element(level: Level, selector: &str) {
show_element_and_initialize(level, selector, |_| {})
}
pub fn show_element_and_initialize<T>(level: Level, selector: &str, initializer: T)
where
T: Fn(Element),
{
let toast_element = document().get_element_by_id("toast").unwrap();
let element: Element = selector_and_clone(selector);
toast_element.set_inner_html("");
toast_element.append_child(&element).unwrap();
initializer(element.clone());
toast_element.set_class_name("show");
Timeout::new(TIME_DISPLAYED, move || {
toast_element.set_class_name("");
})
.forget();
}