From a0f60152bc7e5866f114ed469809ce8be70d17d4 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:19:12 +0800 Subject: [PATCH 01/10] feat: link open in browser --- examples/link.rs | 27 +++++++++++++++++++++++++++ packages/desktop/Cargo.toml | 1 + packages/desktop/src/index.js | 25 ++++++++++++++++++++++++- packages/desktop/src/lib.rs | 21 +++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 examples/link.rs diff --git a/examples/link.rs b/examples/link.rs new file mode 100644 index 000000000..bed14f8a2 --- /dev/null +++ b/examples/link.rs @@ -0,0 +1,27 @@ +use dioxus::prelude::*; + +fn main() { + dioxus::desktop::launch(app); +} + +fn app(cx: Scope) -> Element { + cx.render(rsx! ( + div { + p { + a { + href: "http://dioxuslabs.com/", + "default link" + } + } + p { + a { + href: "http://dioxuslabs.com/", + onclick: |_| { + println!("Hello Dioxus"); + }, + "custom event link", + } + } + } + )) +} diff --git a/packages/desktop/Cargo.toml b/packages/desktop/Cargo.toml index 8a0e5e8f5..eb9425c1f 100644 --- a/packages/desktop/Cargo.toml +++ b/packages/desktop/Cargo.toml @@ -29,6 +29,7 @@ tokio = { version = "1.12.0", features = [ ], optional = true, default-features = false } dioxus-core-macro = { path = "../core-macro", version ="^0.1.6"} dioxus-html = { path = "../html", features = ["serialize"], version ="^0.1.4"} +webbrowser = "0.5.5" [features] default = ["tokio_runtime"] diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index 88cf9fcdc..b7de5bf0d 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -374,7 +374,7 @@ class Interpreter { } SetAttribute(edit) { - // console.log("setting attr", edit); + console.log("setting attr", edit); const name = edit.field; const value = edit.value; const ns = edit.ns; @@ -399,6 +399,29 @@ class Interpreter { break; case "dangerous_inner_html": node.innerHTML = value; + break; + case "href": + + if (node.tagName == "A") { + // open the tag in browser + node.setAttribute("browser-href", value); + node.setAttribute("href", "#"); + + node.addEventListener("click", function(event) { + + const target = event.target; + const real_id = target.getAttribute(`dioxus-id`); + + rpc.call("browser_open", { + mounted_dom_id: parseInt(real_id), + href: target.getAttribute("browser-href"), + }) + }) + + } else { + node.setAttribute(name, value); + } + break; default: // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364 diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 0b6044761..546db27c1 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -187,6 +187,27 @@ pub fn launch_with_props( is_ready.store(true, std::sync::atomic::Ordering::Relaxed); let _ = proxy.send_event(UserWindowEvent::Update); } + "browser_open" => { + let data = req.params.unwrap(); + log::trace!("Open browser: {:?}", data); + if data.is_array() { + let arr = data.as_array().unwrap(); + if arr[0].is_object() { + let temp = arr[0] + .as_object() + .unwrap(); + if temp.contains_key("href") { + let url = temp + .get("href").unwrap() + .as_str().unwrap(); + match webbrowser::open(url) { + Ok(_) => {}, + Err(e) => log::trace!("Open browser error: {:?}", e), + } + } + } + } + } _ => {} } None From c737c424b05ad8453e8770a14a0d210fb0c7c2fe Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:19:58 +0800 Subject: [PATCH 02/10] feat: link open in browser --- packages/desktop/src/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index b7de5bf0d..d15fc39b0 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -374,7 +374,9 @@ class Interpreter { } SetAttribute(edit) { - console.log("setting attr", edit); + + // console.log("setting attr", edit); + const name = edit.field; const value = edit.value; const ns = edit.ns; From 5233ee97d9314f7f0e0bdf05c56d2a9e4201a596 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:20:36 +0800 Subject: [PATCH 03/10] fix: format code --- examples/link.rs | 2 +- packages/desktop/src/lib.rs | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/link.rs b/examples/link.rs index bed14f8a2..da4b5b459 100644 --- a/examples/link.rs +++ b/examples/link.rs @@ -6,7 +6,7 @@ fn main() { fn app(cx: Scope) -> Element { cx.render(rsx! ( - div { + div { p { a { href: "http://dioxuslabs.com/", diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 546db27c1..0f451bd0d 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -193,16 +193,14 @@ pub fn launch_with_props( if data.is_array() { let arr = data.as_array().unwrap(); if arr[0].is_object() { - let temp = arr[0] - .as_object() - .unwrap(); + let temp = arr[0].as_object().unwrap(); if temp.contains_key("href") { - let url = temp - .get("href").unwrap() - .as_str().unwrap(); + let url = temp.get("href").unwrap().as_str().unwrap(); match webbrowser::open(url) { - Ok(_) => {}, - Err(e) => log::trace!("Open browser error: {:?}", e), + Ok(_) => {} + Err(e) => { + log::trace!("Open browser error: {:?}", e) + } } } } From 9e04ce5342850d2e0a01dde169807d6f6eb16566 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 09:32:27 +0800 Subject: [PATCH 04/10] feat: `open_browser` bool attribute --- examples/link.rs | 1 + packages/desktop/src/index.js | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/link.rs b/examples/link.rs index da4b5b459..49921f98a 100644 --- a/examples/link.rs +++ b/examples/link.rs @@ -16,6 +16,7 @@ fn app(cx: Scope) -> Element { p { a { href: "http://dioxuslabs.com/", + "browser-open": "false", onclick: |_| { println!("Hello Dioxus"); }, diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index d15fc39b0..c141f56d4 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -414,10 +414,15 @@ class Interpreter { const target = event.target; const real_id = target.getAttribute(`dioxus-id`); - rpc.call("browser_open", { - mounted_dom_id: parseInt(real_id), - href: target.getAttribute("browser-href"), - }) + if (target.getAttribute("browser-open") != "false") { + rpc.call("browser_open", { + mounted_dom_id: parseInt(real_id), + href: target.getAttribute("browser-href"), + }); + } else { + window.location = target.getAttribute("browser-href"); + } + }) } else { From f006f50317f4b75fac353bc988db057a281ba7f8 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 14:52:14 +0800 Subject: [PATCH 05/10] feat: move `rpc` to handler --- examples/link.rs | 2 +- packages/desktop/src/index.js | 43 ++++++++++++----------------------- 2 files changed, 16 insertions(+), 29 deletions(-) diff --git a/examples/link.rs b/examples/link.rs index 49921f98a..41b010e8d 100644 --- a/examples/link.rs +++ b/examples/link.rs @@ -16,7 +16,7 @@ fn app(cx: Scope) -> Element { p { a { href: "http://dioxuslabs.com/", - "browser-open": "false", + prevent_default: "onclick", onclick: |_| { println!("Hello Dioxus"); }, diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index c141f56d4..0bd767581 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -343,6 +343,7 @@ class Interpreter { this.listeners[event_name] = true; this.root.addEventListener(event_name, (event) => { + const target = event.target; const real_id = target.getAttribute(`dioxus-id`); @@ -356,6 +357,20 @@ class Interpreter { event.preventDefault(); } + console.log(event); + if (event.type == "click") { + event.preventDefault(); + if (should_prevent_default !== `onclick`) { + console.log(event.target.getAttribute("href")); + if(element.tagName == "A") { + rpc.call("browser_open", { + mounted_dom_id: parseInt(real_id), + href: event.target.getAttribute("href") + }) + } + } + } + if (real_id == null) { return; } @@ -401,34 +416,6 @@ class Interpreter { break; case "dangerous_inner_html": node.innerHTML = value; - break; - case "href": - - if (node.tagName == "A") { - // open the tag in browser - node.setAttribute("browser-href", value); - node.setAttribute("href", "#"); - - node.addEventListener("click", function(event) { - - const target = event.target; - const real_id = target.getAttribute(`dioxus-id`); - - if (target.getAttribute("browser-open") != "false") { - rpc.call("browser_open", { - mounted_dom_id: parseInt(real_id), - href: target.getAttribute("browser-href"), - }); - } else { - window.location = target.getAttribute("browser-href"); - } - - }) - - } else { - node.setAttribute(name, value); - } - break; default: // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364 From 62b637f8b0eaf616c49461fa23b9251a79abc147 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 14:54:48 +0800 Subject: [PATCH 06/10] fix: error pattern --- packages/desktop/src/lib.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 0f451bd0d..38c85052a 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -196,11 +196,8 @@ pub fn launch_with_props( let temp = arr[0].as_object().unwrap(); if temp.contains_key("href") { let url = temp.get("href").unwrap().as_str().unwrap(); - match webbrowser::open(url) { - Ok(_) => {} - Err(e) => { - log::trace!("Open browser error: {:?}", e) - } + if let Err(e) = webbrowser::open(url) { + log::error!("Open Browser error: {:?}", e); } } } From 46fd6ac3450ca5ebf9aecb2d59a5a92b2a68bdd0 Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 14:57:41 +0800 Subject: [PATCH 07/10] feat: link open in browser --- packages/desktop/src/lib.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index 38c85052a..8526a4a93 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -190,10 +190,8 @@ pub fn launch_with_props( "browser_open" => { let data = req.params.unwrap(); log::trace!("Open browser: {:?}", data); - if data.is_array() { - let arr = data.as_array().unwrap(); - if arr[0].is_object() { - let temp = arr[0].as_object().unwrap(); + if let Some(arr) = data.as_array() { + if let Some(temp) = arr[0].as_object() { if temp.contains_key("href") { let url = temp.get("href").unwrap().as_str().unwrap(); if let Err(e) = webbrowser::open(url) { From 8089023a6c3a54957af9c9c05c9dee6088b059ef Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:00:49 +0800 Subject: [PATCH 08/10] fix: prevent `submit` default --- packages/desktop/src/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index 0bd767581..3ab21d6ba 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -357,7 +357,10 @@ class Interpreter { event.preventDefault(); } - console.log(event); + if (event.type == "submit") { + event.preventDefault(); + } + if (event.type == "click") { event.preventDefault(); if (should_prevent_default !== `onclick`) { From 327f9015481809d8e5b9e69f26202e8d66dd198e Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 23:15:39 +0800 Subject: [PATCH 09/10] fix: check `href` null --- packages/desktop/src/index.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index 3ab21d6ba..685d1c7be 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -364,12 +364,14 @@ class Interpreter { if (event.type == "click") { event.preventDefault(); if (should_prevent_default !== `onclick`) { - console.log(event.target.getAttribute("href")); if(element.tagName == "A") { - rpc.call("browser_open", { - mounted_dom_id: parseInt(real_id), - href: event.target.getAttribute("href") - }) + const href = event.target.getAttribute("href") + if (href !== "" || href !== null) { + rpc.call("browser_open", { + mounted_dom_id: parseInt(real_id), + href: event.target.getAttribute("href") + }); + } } } } From 2073b400df55f0c6d8bed7371b2313be6c064e6e Mon Sep 17 00:00:00 2001 From: YuKun Liu <41265098+mrxiaozhuox@users.noreply.github.com> Date: Tue, 18 Jan 2022 23:25:45 +0800 Subject: [PATCH 10/10] fix: check `href` null --- packages/desktop/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/desktop/src/index.js b/packages/desktop/src/index.js index 685d1c7be..2aba572f4 100644 --- a/packages/desktop/src/index.js +++ b/packages/desktop/src/index.js @@ -366,7 +366,7 @@ class Interpreter { if (should_prevent_default !== `onclick`) { if(element.tagName == "A") { const href = event.target.getAttribute("href") - if (href !== "" || href !== null) { + if (href !== "" && href !== null && href !== undefined) { rpc.call("browser_open", { mounted_dom_id: parseInt(real_id), href: event.target.getAttribute("href")