fix liveview mounted event
This commit is contained in:
1 parent
06ca8c53d8
commit
c9612a085e
10 files changed
+195
-176
No files matched your search
@@ -29,7 +29,7 @@ impl RenderedElementBacking for LiveviewElement {
|
||||
>,
|
||||
>,
|
||||
> {
|
||||
let script = format!("return window.interpreter.GetClientRect({});", self.id.0);
|
||||
let script = format!("return getClientRect({});", self.id.0);
|
||||
|
||||
let fut = self
|
||||
.query
|
||||
@@ -53,7 +53,7 @@ impl RenderedElementBacking for LiveviewElement {
|
||||
behavior: dioxus_html::ScrollBehavior,
|
||||
) -> std::pin::Pin<Box<dyn futures_util::Future<Output = dioxus_html::MountedResult<()>>>> {
|
||||
let script = format!(
|
||||
"return window.interpreter.ScrollTo({}, {});",
|
||||
"return scrollTo({}, {});",
|
||||
self.id.0,
|
||||
serde_json::to_string(&behavior).expect("Failed to serialize ScrollBehavior")
|
||||
);
|
||||
@@ -76,10 +76,7 @@ impl RenderedElementBacking for LiveviewElement {
|
||||
&self,
|
||||
focus: bool,
|
||||
) -> std::pin::Pin<Box<dyn futures_util::Future<Output = dioxus_html::MountedResult<()>>>> {
|
||||
let script = format!(
|
||||
"return window.interpreter.SetFocus({}, {});",
|
||||
self.id.0, focus
|
||||
);
|
||||
let script = format!("return setFocus({}, {});", self.id.0, focus);
|
||||
|
||||
let fut = self.query.new_query::<bool>(&script).resolve();
|
||||
|
||||
|
||||
@@ -28,19 +28,26 @@ class IPC {
|
||||
};
|
||||
|
||||
ws.onmessage = (message) => {
|
||||
if (message.data instanceof ArrayBuffer) {
|
||||
console.log(message.data);
|
||||
const u8view = new Uint8Array(message.data);
|
||||
const binaryFrame = u8view[0] == 1;
|
||||
const messageData = message.data.slice(1)
|
||||
// The first byte tells the shim if this is a binary of text frame
|
||||
if (binaryFrame) {
|
||||
// binary frame
|
||||
run_from_bytes(message.data);
|
||||
} else {
|
||||
run_from_bytes(messageData);
|
||||
}
|
||||
else {
|
||||
// text frame
|
||||
|
||||
let decoder = new TextDecoder("utf-8");
|
||||
|
||||
// Using decode method to get string output
|
||||
let str = decoder.decode(messageData);
|
||||
// Ignore pongs
|
||||
if (message.data != "__pong__") {
|
||||
const event = JSON.parse(message.data);
|
||||
if (str != "__pong__") {
|
||||
const event = JSON.parse(str);
|
||||
switch (event.type) {
|
||||
case "edits":
|
||||
let edits = event.data;
|
||||
window.interpreter.handleEdits(edits);
|
||||
break;
|
||||
case "query":
|
||||
Function("Eval", `"use strict";${event.data};`)();
|
||||
break;
|
||||
|
||||
@@ -6,7 +6,7 @@ use crate::{
|
||||
};
|
||||
use dioxus_core::{prelude::*, BorrowedAttributeValue, Mutations};
|
||||
use dioxus_html::{event_bubbles, EventData, HtmlEvent, MountedData};
|
||||
use dioxus_interpreter_js::Channel;
|
||||
use dioxus_interpreter_js::binary_protocol::Channel;
|
||||
use futures_util::{pin_mut, SinkExt, StreamExt};
|
||||
use rustc_hash::FxHashMap;
|
||||
use serde::Serialize;
|
||||
@@ -173,7 +173,7 @@ pub async fn run(mut vdom: VirtualDom, ws: impl LiveViewSocket) -> Result<(), Li
|
||||
match evt.as_ref().map(|o| o.as_deref()) {
|
||||
// respond with a pong every ping to keep the websocket alive
|
||||
Some(Ok(b"__ping__")) => {
|
||||
// ws.send(b"__pong__".to_vec()).await?;
|
||||
ws.send(text_frame("__pong__")).await?;
|
||||
}
|
||||
Some(Ok(evt)) => {
|
||||
if let Ok(message) = serde_json::from_str::<IpcMessage>(&String::from_utf8_lossy(evt)) {
|
||||
@@ -212,7 +212,7 @@ pub async fn run(mut vdom: VirtualDom, ws: impl LiveViewSocket) -> Result<(), Li
|
||||
|
||||
// handle any new queries
|
||||
Some(query) = query_rx.recv() => {
|
||||
// ws.send(serde_json::to_string(&ClientUpdate::Query(query)).unwrap().into_bytes()).await?;
|
||||
ws.send(text_frame(&serde_json::to_string(&ClientUpdate::Query(query)).unwrap())).await?;
|
||||
}
|
||||
|
||||
Some(msg) = hot_reload_wait => {
|
||||
@@ -247,13 +247,19 @@ pub async fn run(mut vdom: VirtualDom, ws: impl LiveViewSocket) -> Result<(), Li
|
||||
}
|
||||
}
|
||||
|
||||
fn text_frame(text: &str) -> Vec<u8> {
|
||||
let mut bytes = vec![0];
|
||||
bytes.extend(text.as_bytes());
|
||||
bytes
|
||||
}
|
||||
|
||||
fn add_template(
|
||||
template: &Template<'static>,
|
||||
channel: &mut Channel,
|
||||
templates: &mut FxHashMap<String, u16>,
|
||||
max_template_count: &mut u16,
|
||||
) {
|
||||
for (idx, root) in template.roots.iter().enumerate() {
|
||||
for root in template.roots.iter() {
|
||||
create_template_node(channel, root);
|
||||
templates.insert(template.name.to_owned(), *max_template_count);
|
||||
}
|
||||
@@ -368,16 +374,16 @@ fn apply_edits(
|
||||
}
|
||||
}
|
||||
|
||||
let bytes: Vec<_> = channel.export_memory().collect();
|
||||
// Add an extra one at the beginning to tell the shim this is a binary frame
|
||||
let mut bytes = vec![1];
|
||||
bytes.extend(channel.export_memory());
|
||||
channel.reset();
|
||||
Some(bytes)
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
#[serde(tag = "type", content = "data")]
|
||||
enum ClientUpdate<'a> {
|
||||
#[serde(rename = "edits")]
|
||||
Edits(Mutations<'a>),
|
||||
enum ClientUpdate {
|
||||
#[serde(rename = "query")]
|
||||
Query(String),
|
||||
}
|
||||
Reference in new issue
Block a user