use rand::{rngs::SmallRng, Rng, SeedableRng};
use unwrap::unwrap;
use wasm_bindgen::{JsCast, JsValue};
use wasm_bindgen_futures::JsFuture;
use web_sys::console;
use web_sys::{Request, RequestInit, Response};
pub fn window() -> web_sys::Window {
unwrap!(web_sys::window())
}
pub fn get_element_by_id(element_id: &str) -> web_sys::Element {
let document = unwrap!(window().document());
unwrap!(document.get_element_by_id(element_id))
}
pub fn get_input_element_value_string_by_id(element_id: &str) -> String {
let input_element = get_element_by_id(element_id);
let input_html_element = unwrap!(input_element.dyn_into::<web_sys::HtmlInputElement>());
input_html_element.value()
}
pub fn get_input_element_value_usize_by_id(element_id: &str) -> usize {
let receiver_ws_uid = get_input_element_value_string_by_id(element_id);
unwrap!(receiver_ws_uid.parse::<usize>())
}
pub fn set_input_element_value_string_by_id(element_id: &str, value: &str) {
let input_element = get_element_by_id(element_id);
let input_html_element = unwrap!(input_element.dyn_into::<web_sys::HtmlInputElement>());
input_html_element.set_value(value);
}
pub fn get_image_element_by_id(element_id: &str) -> web_sys::HtmlImageElement {
let img_element = get_element_by_id(element_id);
unwrap!(img_element.dyn_into::<web_sys::HtmlImageElement>())
}
pub fn get_audio_element_by_id(element_id: &str) -> web_sys::HtmlAudioElement {
let audio_element = get_element_by_id(element_id);
unwrap!(audio_element.dyn_into::<web_sys::HtmlAudioElement>())
}
pub fn save_to_local_storage(name: &str, value: &str) {
let ls = unwrap!(unwrap!(window().local_storage()));
let _x = ls.set_item(name, value);
}
pub fn load_string_from_local_storage(name: &str, default_value: &str) -> String {
let ls = unwrap!(unwrap!(window().local_storage()));
unwrap!(ls.get_item(name)).unwrap_or(default_value.to_string())
}
pub fn load_string_from_session_storage(name: &str, default_value: &str) -> String {
let ls = unwrap!(unwrap!(window().session_storage()));
let default_value_string = default_value.to_string();
unwrap!(ls.get_item(name)).unwrap_or(default_value_string)
}
pub fn save_string_to_session_storage(name: &str, value: &str) {
let ls = unwrap!(unwrap!(window().session_storage()));
let _x = ls.set_item(name, value);
}
pub fn get_random(min: usize, max: usize) -> usize {
let mut rng = SmallRng::from_entropy();
rng.gen_range(min, max)
}
pub async fn fetch_response(url: String) -> String {
let mut opts = RequestInit::new();
opts.method("GET");
let request = unwrap!(Request::new_with_str_and_init(&url, &opts));
let resp_jsvalue = unwrap!(JsFuture::from(window().fetch_with_request(&request)).await);
let resp: Response = unwrap!(resp_jsvalue.dyn_into());
let text_jsvalue = unwrap!(JsFuture::from(unwrap!(resp.text())).await);
let txt_response: String = unwrap!(text_jsvalue.as_string());
txt_response
}
pub async fn fetch_only(url: String) {
let mut opts = RequestInit::new();
opts.method("GET");
let request = unwrap!(Request::new_with_str_and_init(&url, &opts));
unwrap!(JsFuture::from(window().fetch_with_request(&request)).await);
}
#[must_use]
pub fn get_url_and_hash() -> (String, String) {
let mut location_href = unwrap!(window().location().href());
location_href = location_href.to_lowercase().replace("index.html", "");
let cl = location_href.clone();
let mut spl = cl.split('#');
location_href = unwrap!(spl.next()).to_string();
let href_hash = spl.next().unwrap_or("").to_string();
(location_href, href_hash)
}
pub fn play_sound(src: &str) {
let audio_element = unwrap!(web_sys::HtmlAudioElement::new_with_src(src));
let _x = unwrap!(audio_element.play());
}
pub fn debug_write(text: &str) {
add_to_begin_of_debug_text(text);
console::log_1(&JsValue::from_str(text));
}
pub fn now_string() -> String {
let now = js_sys::Date::new_0();
format!(
"{:02}:{:02}.{:03}",
now.get_minutes(),
now.get_seconds(),
now.get_milliseconds()
)
}
pub fn open_new_local_page_push_to_history(hash: &str) {
let _x = window().location().assign(hash);
}
pub fn open_new_tab(url: &str) {
let _w = window().open_with_url_and_target(url, "_blank");
}
pub fn get_debug_text() -> String {
load_string_from_session_storage("debug_text", "")
}
pub fn add_to_begin_of_debug_text(text: &str) {
let mut debug_text = format!("{}: {}\n{}", now_string(), text, get_debug_text());
utf8_truncate(&mut debug_text, 800);
save_string_to_session_storage("debug_text", &debug_text);
}
fn utf8_truncate(input: &mut String, max_size: usize) {
let mut utf8_max_size = input.len();
if utf8_max_size >= max_size {
{
let mut char_iter = input.char_indices();
while utf8_max_size >= max_size {
utf8_max_size = match char_iter.next_back() {
Some((index, _)) => index,
None => 0,
};
}
} input.truncate(utf8_max_size);
}
}
pub fn prepare_json_msg_receivers_for_one(receiver_ws_uid: usize) -> String {
let mut vec_msg_receivers = Vec::new();
vec_msg_receivers.push(receiver_ws_uid);
unwrap!(serde_json::to_string(&vec_msg_receivers))
}