dioxus_web_component/
event.rs1use dioxus::logger::tracing::debug;
2use dioxus::prelude::EventHandler;
3use wasm_bindgen::{JsValue, UnwrapThrowExt};
4use web_sys::{CustomEvent, EventTarget};
5
6#[derive(Clone, Copy)]
12pub struct CustomEventOptions {
13 pub can_bubble: bool,
17
18 pub cancelable: bool,
22}
23
24impl Default for CustomEventOptions {
25 fn default() -> Self {
26 Self {
27 can_bubble: true,
28 cancelable: true,
29 }
30 }
31}
32
33pub fn custom_event_handler<T>(
35 target: impl AsRef<EventTarget> + 'static,
36 event_type: &'static str,
37 options: CustomEventOptions,
38) -> EventHandler<T>
39where
40 T: Into<JsValue> + 'static,
41{
42 EventHandler::new(move |value: T| {
43 let CustomEventOptions {
44 can_bubble,
45 cancelable,
46 } = options;
47 let event = CustomEvent::new(event_type).unwrap_throw();
48 let detail = value.into();
49 event.init_custom_event_with_can_bubble_and_cancelable_and_detail(
50 event_type, can_bubble, cancelable, &detail,
51 );
52 debug!(?event, "dispatch event");
53 let target = target.as_ref();
54 target.dispatch_event(&event).unwrap_throw();
55 })
56}