Merge pull request #1823 from ealmloff/fix-mount-event

This commit is contained in:
Jonathan Kelley authored and GitHub committed 2024-01-12 20:01:02 -08:00
commit 319318a6e2
5 files changed
+41 -62

No files matched your search

+15 -1
View File
@@ -216,13 +216,27 @@ fn app(cx: Scope) -> Element {
r#"new FocusEvent("focusout",{bubbles: true})"#, r#"new FocusEvent("focusout",{bubbles: true})"#,
); );
if **received_events == 12 { if **received_events == 13 {
println!("all events recieved"); println!("all events recieved");
desktop_context.close(); desktop_context.close();
} }
render! { render! {
div { div {
div {
width: "100px",
height: "100px",
onmounted: move |evt| {
to_owned![received_events];
async move {
let rect = evt.get_client_rect().await.unwrap();
println!("rect: {:?}", rect);
assert_eq!(rect.width(), 100.0);
assert_eq!(rect.height(), 100.0);
received_events.modify(|x| *x + 1)
}
}
}
button { button {
id: "button", id: "button",
onclick: move |event| { onclick: move |event| {
+2 -2
View File
@@ -6,7 +6,7 @@ use crate::{
LiveViewError, LiveViewError,
}; };
use dioxus_core::{prelude::*, BorrowedAttributeValue, Mutations}; use dioxus_core::{prelude::*, BorrowedAttributeValue, Mutations};
use dioxus_html::{event_bubbles, EventData, HtmlEvent, MountedData, PlatformEventData}; use dioxus_html::{event_bubbles, EventData, HtmlEvent, PlatformEventData};
use dioxus_interpreter_js::binary_protocol::Channel; use dioxus_interpreter_js::binary_protocol::Channel;
use futures_util::{pin_mut, SinkExt, StreamExt}; use futures_util::{pin_mut, SinkExt, StreamExt};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
@@ -188,7 +188,7 @@ pub async fn run(mut vdom: VirtualDom, ws: impl LiveViewSocket) -> Result<(), Li
let element = LiveviewElement::new(evt.element, query_engine.clone()); let element = LiveviewElement::new(evt.element, query_engine.clone());
vdom.handle_event( vdom.handle_event(
&evt.name, &evt.name,
Rc::new(PlatformEventData::new(Box::new(MountedData::new(element)))), Rc::new(PlatformEventData::new(Box::new(element))),
evt.element, evt.element,
evt.bubbles, evt.bubbles,
); );
+2 -4
View File
@@ -9,8 +9,8 @@
use dioxus_core::{ use dioxus_core::{
BorrowedAttributeValue, ElementId, Mutation, Template, TemplateAttribute, TemplateNode, BorrowedAttributeValue, ElementId, Mutation, Template, TemplateAttribute, TemplateNode,
}; };
use dioxus_html::event_bubbles;
use dioxus_html::PlatformEventData; use dioxus_html::PlatformEventData;
use dioxus_html::{event_bubbles, MountedData};
use dioxus_interpreter_js::{get_node, minimal_bindings, save_template, Channel}; use dioxus_interpreter_js::{get_node, minimal_bindings, save_template, Channel};
use futures_channel::mpsc; use futures_channel::mpsc;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
@@ -267,13 +267,11 @@ impl WebsysDom {
pub(crate) fn send_mount_event(&self, id: ElementId) { pub(crate) fn send_mount_event(&self, id: ElementId) {
let node = get_node(id.0 as u32); let node = get_node(id.0 as u32);
if let Some(element) = node.dyn_ref::<Element>() { if let Some(element) = node.dyn_ref::<Element>() {
let data: MountedData = element.into();
let data = Box::new(data);
let _ = self.event_channel.unbounded_send(UiEvent { let _ = self.event_channel.unbounded_send(UiEvent {
name: "mounted".to_string(), name: "mounted".to_string(),
bubbles: false, bubbles: false,
element: id, element: id,
data: PlatformEventData::new(data), data: PlatformEventData::new(Box::new(element.clone())),
}); });
} }
} }
+6 -20
View File
@@ -11,29 +11,15 @@ fn app(cx: Scope) -> Element {
"hello axum! {num}" "hello axum! {num}"
button { onclick: move |_| num += 1, "Increment" } button { onclick: move |_| num += 1, "Increment" }
} }
svg { svg { circle { cx: 50, cy: 50, r: 40, stroke: "green", fill: "yellow" } }
circle { cx: 50, cy: 50, r: 40, stroke: "green", fill: "yellow" } div { class: "raw-attribute-div", "raw-attribute": "raw-attribute-value" }
} div { class: "hidden-attribute-div", hidden: true }
div {
class: "raw-attribute-div",
"raw-attribute": "raw-attribute-value",
}
div {
class: "hidden-attribute-div",
hidden: true,
}
div { div {
class: "dangerous-inner-html-div", class: "dangerous-inner-html-div",
dangerous_inner_html: "<p>hello dangerous inner html</p>", dangerous_inner_html: "<p>hello dangerous inner html</p>"
}
input {
value: "hello input",
}
div {
class: "style-div",
color: "red",
"colored text"
} }
input { value: "hello input" }
div { class: "style-div", color: "red", "colored text" }
}) })
} }
+16 -35
View File
@@ -11,57 +11,38 @@ fn app(cx: Scope) -> Element {
cx.render(rsx! { cx.render(rsx! {
div { div {
"hello axum! {num}" "hello axum! {num}"
button { button { class: "increment-button", onclick: move |_| num += 1, "Increment" }
class: "increment-button",
onclick: move |_| num += 1, "Increment"
}
}
svg {
circle { cx: 50, cy: 50, r: 40, stroke: "green", fill: "yellow" }
}
div {
class: "raw-attribute-div",
"raw-attribute": "raw-attribute-value",
}
div {
class: "hidden-attribute-div",
hidden: true,
} }
svg { circle { cx: 50, cy: 50, r: 40, stroke: "green", fill: "yellow" } }
div { class: "raw-attribute-div", "raw-attribute": "raw-attribute-value" }
div { class: "hidden-attribute-div", hidden: true }
div { div {
class: "dangerous-inner-html-div", class: "dangerous-inner-html-div",
dangerous_inner_html: "<p>hello dangerous inner html</p>", dangerous_inner_html: "<p>hello dangerous inner html</p>"
}
input {
value: "hello input",
}
div {
class: "style-div",
color: "red",
"colored text"
} }
input { value: "hello input" }
div { class: "style-div", color: "red", "colored text" }
button { button {
class: "eval-button", class: "eval-button",
onclick: move |_| { onclick: move |_| {
let eval = eval_provider( let eval = eval_provider(
r#" r#"
window.document.title = 'Hello from Dioxus Eval!'; window.document.title = 'Hello from Dioxus Eval!';
dioxus.send("returned eval value"); dioxus.send("returned eval value");
"#).unwrap(); "#,
)
.unwrap();
let setter = eval_result.setter(); let setter = eval_result.setter();
async move { async move {
// Set the window title
let result = eval.recv().await; let result = eval.recv().await;
if let Ok(serde_json::Value::String(string)) = result { if let Ok(serde_json::Value::String(string)) = result {
setter(string); setter(string);
} }
}
}}, },
"Eval" "Eval"
} }
div { div { class: "eval-result", "{eval_result}" }
class: "eval-result",
"{eval_result}"
}
}) })
} }