virtual_node/event/
non_delegated_event_wrapper.rs1use crate::event::virtual_events::ElementEventsId;
2use crate::event::{EventHandler, EventName, MouseEvent, VirtualEvents, ELEMENT_EVENTS_ID_PROP};
3use js_sys::Reflect;
4use std::rc::Rc;
5use wasm_bindgen::closure::Closure;
6use wasm_bindgen::JsCast;
7
8pub fn insert_non_delegated_event(
12 element: &web_sys::Element,
13 onevent: &EventName,
14 callback: &EventHandler,
15 events_id: ElementEventsId,
16 events: &VirtualEvents,
17) {
18 let events_clone = events.clone();
19
20 let event_name = onevent.without_on_prefix();
21
22 let on_event = onevent.with_on_prefix().to_string();
23 let on_event_clone = on_event.clone();
24
25 let callback_wrapper = move |event: web_sys::Event| {
26 let this_elem = event.current_target().unwrap();
27
28 let events_id = Reflect::get(&this_elem, &ELEMENT_EVENTS_ID_PROP.into()).unwrap();
29 let events_id = events_id.as_string();
30 let events_id = events_id.unwrap();
31
32 let events_id =
33 events_id.trim_start_matches(&events_clone.events_id_props_prefix().to_string());
34 let events_id: u32 = events_id.parse().unwrap();
35
36 let event_name = EventName::new(on_event_clone.clone().into());
37 let cb = events_clone
38 .get_event_handler(&ElementEventsId::new(events_id), &event_name)
39 .unwrap();
40
41 match cb {
42 EventHandler::NoArgs(no_args) => (no_args.borrow_mut())(),
43 EventHandler::MouseEvent(mouse) => {
44 (mouse.borrow_mut())(MouseEvent::new(event.dyn_into().unwrap()));
45 }
46 EventHandler::UnsupportedSignature(cb) => cb.call(&event),
47 };
48 };
49
50 let callback_wrapper = Box::new(callback_wrapper) as Box<dyn FnMut(_) -> ()>;
51 let callback_wrapper = Closure::wrap(callback_wrapper);
52
53 let current_elem: &web_sys::EventTarget = element.dyn_ref().unwrap();
54 current_elem
55 .add_event_listener_with_callback(
56 event_name,
57 callback_wrapper.as_ref().as_ref().unchecked_ref(),
58 )
59 .unwrap();
60
61 events.insert_event(
62 events_id,
63 onevent.clone(),
64 callback.clone(),
65 Some(Rc::new(callback_wrapper)),
66 );
67}