sauron_core/dom/
document.rs

1use crate::dom::document;
2use crate::dom::{dom_node::intern, Cmd};
3use futures::channel::mpsc;
4use wasm_bindgen::{prelude::*, JsCast};
5
6/// Provides function for document related functions
7#[derive(Clone, Copy)]
8pub struct Document;
9
10impl Document {
11    ///
12    pub fn on_selectionchange<F, MSG>(mut cb: F) -> Cmd<MSG>
13    where
14        F: FnMut(Option<web_sys::Selection>) -> MSG + Clone + 'static,
15        MSG: 'static,
16    {
17        let (mut tx, rx) = mpsc::unbounded();
18        let closure_cb: Closure<dyn FnMut(web_sys::Event)> =
19            Closure::new(move |_event: web_sys::Event| {
20                let selection = document().get_selection().ok().flatten();
21                let msg = cb(selection);
22                tx.start_send(msg).expect("send");
23            });
24        document()
25            .add_event_listener_with_callback(
26                intern("selectionchange"),
27                closure_cb.as_ref().unchecked_ref(),
28            )
29            .expect("add event callback");
30        Cmd::recurring(rx, closure_cb)
31    }
32}