use crate::dom_types;
use std::fmt;
use wasm_bindgen::closure::Closure;
use wasm_bindgen::JsCast;
use web_sys;
pub fn window() -> web_sys::Window {
web_sys::window().expect("Can't find the global Window")
}
pub fn document() -> web_sys::Document {
window()
.document()
.expect("Can't find the window's document")
}
pub fn body() -> web_sys::HtmlElement {
document().body().expect("Can't find the document's body")
}
pub fn history() -> web_sys::History {
window().history().expect("Can't find history")
}
#[allow(dead_code)]
pub fn request_animation_frame(f: &Closure<FnMut()>) {
window()
.request_animation_frame(f.as_ref().unchecked_ref())
.expect("Problem requesting animation frame");
}
pub fn get_value(target: &web_sys::EventTarget) -> String {
if let Some(input) = target.dyn_ref::<web_sys::HtmlInputElement>() {
return input.value();
}
if let Some(input) = target.dyn_ref::<web_sys::HtmlTextAreaElement>() {
return input.value();
}
if let Some(input) = target.dyn_ref::<web_sys::HtmlSelectElement>() {
return input.value();
}
"".into()
}
pub fn set_value(target: &web_sys::EventTarget, value: &str) {
if let Some(input) = target.dyn_ref::<web_sys::HtmlInputElement>() {
input.set_value(value);
}
if let Some(input) = target.dyn_ref::<web_sys::HtmlTextAreaElement>() {
input.set_value(value);
}
if let Some(input) = target.dyn_ref::<web_sys::HtmlSelectElement>() {
input.set_value(value);
}
}
pub fn log<D: fmt::Debug>(text: D) {
web_sys::console::log_1(&format!("{:#?}", &text).into());
}
pub fn error<D: fmt::Debug>(text: D) {
web_sys::console::error_1(&format!("{:#?}", &text).into());
}
pub fn update<Ms>(msg: Ms)
where
Ms: Clone + 'static + serde::Serialize,
{
let msg_as_js_value = wasm_bindgen::JsValue::from_serde(&msg)
.expect("Error: TriggerUpdate - can't serialize given msg!");
let mut custom_event_config = web_sys::CustomEventInit::new();
custom_event_config.detail(&msg_as_js_value);
let event = web_sys::CustomEvent::new_with_event_init_dict(
dom_types::UPDATE_TRIGGER_EVENT_ID,
&custom_event_config,
)
.expect("Error: TriggerUpdate - create event failed!");
window()
.dispatch_event(&event)
.expect("Error: TriggerUpdate - dispatch)event failed!");
}