diff --git a/crates/core/src/dom/dom_node.rs b/crates/core/src/dom/dom_node.rs index c6e1786f..135aec7e 100644 --- a/crates/core/src/dom/dom_node.rs +++ b/crates/core/src/dom/dom_node.rs @@ -184,9 +184,10 @@ impl DomNode { } } - pub(crate) fn as_element(&self) -> web_sys::Element { + /// exposed the underlying wrapped node as `web_sys::Element` + pub fn as_element(&self) -> web_sys::Element { match &self.inner { - DomInner::Element { element, .. } => element.clone().unchecked_into(), + DomInner::Element { element, .. } => element.clone(), DomInner::Fragment { fragment, .. } => { let fragment: web_sys::Element = fragment.clone().unchecked_into(); assert!(fragment.is_object()); diff --git a/crates/core/src/dom/window.rs b/crates/core/src/dom/window.rs index 0be16a41..946c7b98 100644 --- a/crates/core/src/dom/window.rs +++ b/crates/core/src/dom/window.rs @@ -77,6 +77,28 @@ impl Window { Cmd::sub(rx, mousemove_cb) } + /// + pub fn on_mousedown(mut cb: F) -> Cmd + where + F: FnMut(web_sys::MouseEvent) -> MSG + Clone + 'static, + MSG: 'static, + { + let (mut tx, rx) = mpsc::unbounded(); + let mousemove_cb: Closure = + Closure::new(move |event: web_sys::Event| { + let mouse_event: MouseEvent = event.dyn_into().expect("must be mouse event"); + let msg = cb(mouse_event); + tx.start_send(msg).expect("send"); + }); + window() + .add_event_listener_with_callback( + intern("mousedown"), + mousemove_cb.as_ref().unchecked_ref(), + ) + .expect("add event callback"); + Cmd::sub(rx, mousemove_cb) + } + /// do this task at every `ms` interval pub fn every_interval(interval_ms: i32, cb: F) -> Cmd where