diff --git a/src/slider/mod.rs b/src/slider/mod.rs index 24a997b..c53382a 100644 --- a/src/slider/mod.rs +++ b/src/slider/mod.rs @@ -47,13 +47,13 @@ pub fn Slider( let on_mouse_down = move |_| { set_mouse_move.set(true); }; - - let on_mouse_up = window_event_listener("mouseup", move |_| { + + let on_mouse_up = window_event_listener(ev::mouseup, move |_| { set_mouse_move.set(false); }); on_cleanup(cx, on_mouse_up); - let on_mouse_move = window_event_listener("mousemove", move |ev| { + let on_mouse_move = window_event_listener(ev::mousemove, move |ev| { if is_mouse_move.get_untracked() { if let Some(rail) = rail_ref.get_untracked() { let ev = ev.unchecked_into::(); diff --git a/src/utils/dom.rs b/src/utils/dom.rs index 1dd8581..f716f6e 100644 --- a/src/utils/dom.rs +++ b/src/utils/dom.rs @@ -1,16 +1,28 @@ use leptos::window; +use leptos_dom::ev; +use std::borrow::Cow; use wasm_bindgen::{prelude::Closure, JsCast}; -pub fn window_event_listener<'a>( - event_name: &'a str, - cb: impl Fn(web_sys::Event) + 'static, -) -> impl FnOnce() -> () + 'a { - let handler = Box::new(cb) as Box; - - let cb = Closure::wrap(handler).into_js_value(); - _ = window().add_event_listener_with_callback(event_name, cb.unchecked_ref()); - - move || { - _ = window().remove_event_listener_with_callback(event_name, cb.unchecked_ref()); +pub fn window_event_listener( + event: E, + cb: impl Fn(E::EventType) + 'static, +) -> impl FnOnce() -> () +where + E::EventType: JsCast, +{ + fn wel( + cb: Box, + event_name: Cow<'static, str>, + ) -> impl FnOnce() -> () + 'static { + let cb = Closure::wrap(cb).into_js_value(); + _ = window().add_event_listener_with_callback(&event_name, cb.unchecked_ref()); + move || { + _ = window().remove_event_listener_with_callback(&event_name, cb.unchecked_ref()); + } } -} + + wel( + Box::new(move |e| cb(e.unchecked_into::())), + event.name(), + ) +} \ No newline at end of file