sauron_core/dom/
document.rs1use crate::dom::document;
2use crate::dom::{dom_node::intern, Cmd};
3use futures::channel::mpsc;
4use wasm_bindgen::{prelude::*, JsCast};
5
6#[derive(Clone, Copy)]
8pub struct Document;
9
10impl Document {
11 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}