dioxus_use_navigator/hooks/use_html_lang/
mod.rs1use super::*;
2use std::{
3 borrow::{Borrow, BorrowMut},
4 fmt::{Display, Formatter},
5};
6use web_sys::MutationObserver;
7
8pub struct UseHtmlLanguage {
9 data: Rc<RefCell<UseHtmlLanguageData>>,
10 listen_html: MutationObserver,
11}
12
13struct UseHtmlLanguageData {
14 html: Element,
15}
16
17impl Display for UseHtmlLanguage {
18 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19 Display::fmt(&self.get(), f)
20 }
21}
22
23impl UseHtmlLanguageData {
24 fn get_lang(&self) -> Option<String> {
25 self.html.get_attribute("lang").or_else(|| self.html.get_attribute("xml:lang"))
26 }
27 fn set_lang(&self, lang: &str) -> Option<()> {
28 self.html.remove_attribute("xml:lang").ok();
29 self.html.set_attribute("lang", lang).ok()
30 }
31}
32
33impl UseHtmlLanguage {
34 pub(crate) fn new(cx: &ScopeState) -> Option<Self> {
35 let html = window()?.document()?.get_elements_by_tag_name("html").get_with_index(0)?;
36 let mut data = UseHtmlLanguageData { html };
37 data.get_lang()?;
39 let regenerate = cx.schedule_update();
40 let listen_html = Self::listen(&data.html);
41 let mut data = Rc::new(RefCell::new(data));
42 Some(Self { data, listen_html })
44 }
45 fn listen(html: &Element) -> MutationObserver {
47 let _ = html;
48 todo!()
50 }
51}
52
53impl UseHtmlLanguage {
54 #[inline]
55 pub fn get(&self) -> String {
56 self.data.as_ref().borrow().get_lang().unwrap_or_default()
57 }
58 #[inline]
59 pub fn set(&self, lang: &str) -> bool {
60 self.data.as_ref().borrow().set_lang(lang).is_some()
61 }
62}