use crate::*;
pub(crate) fn get_handler_registry() -> &'static mut HashMap<(usize, String), HandlerEntry> {
unsafe {
if HANDLER_REGISTRY.is_null() {
let registry: Box<HashMap<(usize, String), HandlerEntry>> = Box::default();
HANDLER_REGISTRY = Box::leak(registry) as *mut HashMap<(usize, String), HandlerEntry>;
}
&mut *HANDLER_REGISTRY
}
}
#[cfg(target_arch = "wasm32")]
pub(crate) fn get_dynamic_listener_registry() -> &'static mut HashMap<usize, JsValue> {
unsafe {
if DYNAMIC_LISTENER_REGISTRY.is_null() {
let registry: Box<HashMap<usize, JsValue>> = Box::default();
DYNAMIC_LISTENER_REGISTRY = Box::leak(registry) as *mut HashMap<usize, JsValue>;
}
&mut *DYNAMIC_LISTENER_REGISTRY
}
}
#[cfg(target_arch = "wasm32")]
pub(crate) fn get_attr_signal_listener_registry() -> &'static mut HashMap<usize, JsValue> {
unsafe {
if ATTR_SIGNAL_LISTENER_REGISTRY.is_null() {
let registry: Box<HashMap<usize, JsValue>> = Box::default();
ATTR_SIGNAL_LISTENER_REGISTRY = Box::leak(registry) as *mut HashMap<usize, JsValue>;
}
&mut *ATTR_SIGNAL_LISTENER_REGISTRY
}
}
#[cfg(target_arch = "wasm32")]
pub(crate) fn register_dynamic_listener(dynamic_id: usize, closure: Closure<dyn FnMut()>) {
let event_name: String = NativeEventName::EuvSignalUpdate.to_string();
let registry: &mut HashMap<usize, JsValue> = get_dynamic_listener_registry();
if let Some(old_js_value) = registry.remove(&dynamic_id) {
let window: Window = window().unwrap();
let _ =
window.remove_event_listener_with_callback(&event_name, old_js_value.unchecked_ref());
}
let js_value: JsValue = closure.as_ref().clone();
let window: Window = window().unwrap();
window
.add_event_listener_with_callback(&event_name, closure.as_ref().unchecked_ref())
.unwrap();
closure.forget();
registry.insert(dynamic_id, js_value);
}
#[cfg(target_arch = "wasm32")]
pub(crate) fn register_attr_signal_listener(signal_key: usize, closure: Closure<dyn FnMut()>) {
let event_name: String = NativeEventName::EuvSignalUpdate.to_string();
let registry: &mut HashMap<usize, JsValue> = get_attr_signal_listener_registry();
if let Some(old_js_value) = registry.remove(&signal_key) {
let window: Window = window().unwrap();
let _ =
window.remove_event_listener_with_callback(&event_name, old_js_value.unchecked_ref());
}
let js_value: JsValue = closure.as_ref().clone();
let window: Window = window().unwrap();
window
.add_event_listener_with_callback(&event_name, closure.as_ref().unchecked_ref())
.unwrap();
closure.forget();
registry.insert(signal_key, js_value);
}
#[cfg(not(target_arch = "wasm32"))]
pub(crate) fn register_dynamic_listener(_dynamic_id: usize, _closure: Closure<dyn FnMut()>) {}
#[cfg(not(target_arch = "wasm32"))]
#[allow(dead_code)]
pub(crate) fn register_attr_signal_listener(_signal_key: usize, _closure: Closure<dyn FnMut()>) {}