dioxus_use_navigator/hooks/use_html_lang/
mod.rs

1use 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        // Make sure the attribute exists
38        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        // listen_html.observe()
43        Some(Self { data, listen_html })
44    }
45    // https://stackoverflow.com/questions/59614459/using-mutationobserver-to-observe-attribute-change-for-a-specific-attribute-only
46    fn listen(html: &Element) -> MutationObserver {
47        let _ = html;
48        // MutationObserver::new()
49        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}