recipes/frontend/src/utils.rs
Greg Burri 418d31a127 * Support for lang in URL as /fr/recipe/view/42
* Create a pages module in the frontend crate
2025-03-26 01:49:02 +01:00

118 lines
2.3 KiB
Rust

use std::str::FromStr;
use chrono::Locale;
use gloo::utils::document;
use wasm_bindgen::prelude::*;
use web_sys::Element;
pub trait SelectorExt {
fn selector<T>(&self, selectors: &str) -> T
where
T: JsCast;
fn selector_all<T>(&self, selectors: &str) -> Vec<T>
where
T: JsCast;
fn deep_clone(&self) -> Self;
}
impl SelectorExt for Element {
fn selector<T>(&self, selectors: &str) -> T
where
T: JsCast,
{
self.query_selector(selectors)
.unwrap()
.unwrap()
.dyn_into::<T>()
.unwrap()
}
fn selector_all<T>(&self, selectors: &str) -> Vec<T>
where
T: JsCast,
{
self.query_selector_all(selectors)
.unwrap()
.values()
.into_iter()
.map(|e| e.unwrap().dyn_into::<T>().unwrap())
.collect()
}
fn deep_clone(&self) -> Self {
self.clone_node_with_deep(true)
.unwrap()
.dyn_into::<Element>()
.unwrap()
}
}
pub fn selector<T>(selectors: &str) -> T
where
T: JsCast,
{
document()
.query_selector(selectors)
.unwrap()
.unwrap()
.dyn_into::<T>()
.unwrap()
}
pub fn selector_all<T>(selectors: &str) -> Vec<T>
where
T: JsCast,
{
document()
.query_selector_all(selectors)
.unwrap()
.values()
.into_iter()
.map(|e| e.unwrap().dyn_into::<T>().unwrap())
.collect()
}
pub fn selector_and_clone<T>(selectors: &str) -> T
where
T: JsCast,
{
document()
.query_selector(selectors)
.unwrap()
.unwrap()
.clone_node_with_deep(true)
.unwrap()
.dyn_into::<T>()
.unwrap()
}
pub fn by_id<T>(element_id: &str) -> T
where
T: JsCast,
{
document()
.get_element_by_id(element_id)
.unwrap()
.dyn_into::<T>()
.unwrap()
}
pub fn get_current_lang() -> String {
selector::<Element>("html")
.get_attribute("lang")
.unwrap()
.split("-")
.next()
.unwrap()
.to_string()
}
pub fn get_locale() -> Locale {
let lang_and_territory = selector::<Element>("html")
.get_attribute("lang")
.unwrap()
.replace("-", "_");
Locale::from_str(&lang_and_territory).unwrap_or_default()
}