|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
use dioxus_core::ElementId;
|
|
|
use dioxus_html::PlatformEventData;
|
|
|
-use dioxus_interpreter_js::unified_bindings::{Interpreter, InterpreterInterface};
|
|
|
+use dioxus_interpreter_js::{unified_bindings::Interpreter, WebInterpreter};
|
|
|
use futures_channel::mpsc;
|
|
|
use rustc_hash::FxHashMap;
|
|
|
use wasm_bindgen::{closure::Closure, JsCast};
|
|
@@ -17,14 +17,16 @@ use web_sys::{Document, Element, Event};
|
|
|
use crate::{load_document, virtual_event_from_websys_event, Config, WebEventConverter};
|
|
|
|
|
|
pub struct WebsysDom {
|
|
|
- pub(crate) document: Document,
|
|
|
#[allow(dead_code)]
|
|
|
pub(crate) root: Element,
|
|
|
+ pub(crate) document: Document,
|
|
|
pub(crate) templates: FxHashMap<String, u16>,
|
|
|
pub(crate) max_template_id: u16,
|
|
|
- pub(crate) interpreter: InterpreterInterface,
|
|
|
+ pub(crate) interpreter: Interpreter,
|
|
|
+
|
|
|
#[cfg(feature = "mounted")]
|
|
|
pub(crate) event_channel: mpsc::UnboundedSender<UiEvent>,
|
|
|
+
|
|
|
#[cfg(feature = "mounted")]
|
|
|
pub(crate) queued_mounted_events: Vec<ElementId>,
|
|
|
}
|
|
@@ -64,7 +66,7 @@ impl WebsysDom {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- let interpreter = InterpreterInterface::default();
|
|
|
+ let interpreter = Interpreter::default();
|
|
|
|
|
|
let handler: Closure<dyn FnMut(&Event)> = Closure::wrap(Box::new({
|
|
|
let event_channel = event_channel.clone();
|
|
@@ -72,42 +74,45 @@ impl WebsysDom {
|
|
|
let name = event.type_();
|
|
|
let element = walk_event_for_id(event);
|
|
|
let bubbles = dioxus_html::event_bubbles(name.as_str());
|
|
|
- if let Some((element, target)) = element {
|
|
|
- let prevent_event;
|
|
|
- if let Some(prevent_requests) = target
|
|
|
- .get_attribute("dioxus-prevent-default")
|
|
|
- .as_deref()
|
|
|
- .map(|f| f.split_whitespace())
|
|
|
- {
|
|
|
- prevent_event = prevent_requests
|
|
|
- .map(|f| f.trim_start_matches("on"))
|
|
|
- .any(|f| f == name);
|
|
|
- } else {
|
|
|
- prevent_event = false;
|
|
|
- }
|
|
|
|
|
|
- // Prevent forms from submitting and redirecting
|
|
|
- if name == "submit" {
|
|
|
- // On forms the default behavior is not to submit, if prevent default is set then we submit the form
|
|
|
- if !prevent_event {
|
|
|
- event.prevent_default();
|
|
|
- }
|
|
|
- } else if prevent_event {
|
|
|
+ let Some((element, target)) = element else {
|
|
|
+ return;
|
|
|
+ };
|
|
|
+
|
|
|
+ let prevent_event;
|
|
|
+ if let Some(prevent_requests) = target
|
|
|
+ .get_attribute("dioxus-prevent-default")
|
|
|
+ .as_deref()
|
|
|
+ .map(|f| f.split_whitespace())
|
|
|
+ {
|
|
|
+ prevent_event = prevent_requests
|
|
|
+ .map(|f| f.trim_start_matches("on"))
|
|
|
+ .any(|f| f == name);
|
|
|
+ } else {
|
|
|
+ prevent_event = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Prevent forms from submitting and redirecting
|
|
|
+ if name == "submit" {
|
|
|
+ // On forms the default behavior is not to submit, if prevent default is set then we submit the form
|
|
|
+ if !prevent_event {
|
|
|
event.prevent_default();
|
|
|
}
|
|
|
-
|
|
|
- let data = virtual_event_from_websys_event(event.clone(), target);
|
|
|
- let _ = event_channel.unbounded_send(UiEvent {
|
|
|
- name,
|
|
|
- bubbles,
|
|
|
- element,
|
|
|
- data,
|
|
|
- });
|
|
|
+ } else if prevent_event {
|
|
|
+ event.prevent_default();
|
|
|
}
|
|
|
+
|
|
|
+ let data = virtual_event_from_websys_event(event.clone(), target);
|
|
|
+ let _ = event_channel.unbounded_send(UiEvent {
|
|
|
+ name,
|
|
|
+ bubbles,
|
|
|
+ element,
|
|
|
+ data,
|
|
|
+ });
|
|
|
}
|
|
|
}));
|
|
|
|
|
|
- let _interpreter: &Interpreter = interpreter.as_ref();
|
|
|
+ let _interpreter: &WebInterpreter = interpreter.as_web();
|
|
|
_interpreter.initialize(
|
|
|
root.clone().unchecked_into(),
|
|
|
handler.as_ref().unchecked_ref(),
|