From 304259d8186d1d34224a74c95f4fd7d14126b499 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Sun, 11 Jul 2021 18:39:45 -0400 Subject: [PATCH] wip: move examples around --- Cargo.toml | 36 +++++++++------- examples/reference/antipatterns.rs | 4 +- examples/reference/empty.rs | 8 +--- examples/reference/fragments.rs | 13 +++--- examples/reference/iterators.rs | 4 +- examples/reference/listener.rs | 4 +- examples/reference/suspense.rs | 42 ++++++++++--------- examples/reference/webcomponents.rs | 15 +++++-- .../atoms/{examples => _examples}/api_mvc.rs | 0 .../atoms/{examples => _examples}/callback.rs | 0 packages/atoms/{examples => _examples}/ecs.rs | 0 .../atoms/{examples => _examples}/family.rs | 0 .../{examples => _examples}/familypoc.rs | 0 .../{examples => _examples}/hellorecoil.rs | 0 .../{examples => _examples}/selectorlist.rs | 0 .../{examples => _examples}/selectors.rs | 0 .../{examples => _examples}/structured_app.rs | 0 .../supense_integration.rs | 0 .../atoms/{examples => _examples}/test.html | 0 packages/core-macro/src/htm.rs | 4 +- packages/core/Cargo.toml | 12 ++---- packages/core/src/virtual_dom.rs | 6 +-- packages/hooks/Cargo.toml | 2 +- packages/hooks/src/lib.rs | 2 +- 24 files changed, 81 insertions(+), 71 deletions(-) rename packages/atoms/{examples => _examples}/api_mvc.rs (100%) rename packages/atoms/{examples => _examples}/callback.rs (100%) rename packages/atoms/{examples => _examples}/ecs.rs (100%) rename packages/atoms/{examples => _examples}/family.rs (100%) rename packages/atoms/{examples => _examples}/familypoc.rs (100%) rename packages/atoms/{examples => _examples}/hellorecoil.rs (100%) rename packages/atoms/{examples => _examples}/selectorlist.rs (100%) rename packages/atoms/{examples => _examples}/selectors.rs (100%) rename packages/atoms/{examples => _examples}/structured_app.rs (100%) rename packages/atoms/{examples => _examples}/supense_integration.rs (100%) rename packages/atoms/{examples => _examples}/test.html (100%) diff --git a/Cargo.toml b/Cargo.toml index af9b5e0c8..c3ca08e03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,26 @@ description = "Core functionality for Dioxus - a concurrent renderer-agnostic Vi # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -dioxus-core = { path="./packages/core", version="0.1.0" } -dioxus-core-macro = { path="./packages/core-macro", version="0.1.0", optional=true } -dioxus-html = { path="./packages/html", optional=true } -dioxus-web = { path="./packages/web", optional=true } -dioxus-webview = { path="./packages/webview", optional=true } -dioxus-hooks = { path="./packages/hooks", version="0.0.0", optional=true } +dioxus-core = { path = "./packages/core" } +dioxus-core-macro = { path = "./packages/core-macro", optional = true } +dioxus-html = { path = "./packages/html", optional = true } +dioxus-web = { path = "./packages/web", optional = true } +dioxus-webview = { path = "./packages/webview", optional = true } +dioxus-hooks = { path = "./packages/hooks", optional = true } [features] -default = ["macro", "ssr", "hooks", "router", "core", "atoms", "html", "web", "desktop"] +default = [ + "core", + "atoms", + "macro", + "ssr", + "hooks", + "router", + "html", + "web", + "desktop", +] atoms = [] macro = ["dioxus-core-macro"] ssr = [] @@ -31,29 +41,25 @@ desktop = ["dioxus-webview"] core = [] -[profile.dev] -split-debuginfo = "unpacked" - - [dev-dependencies] futures = "0.3.15" log = "0.4.14" num-format = "0.4.0" rand = "0.8.4" separator = "0.4.1" -serde = { version="1.0.126", features=["derive"] } +serde = { version = "1.0.126", features = ["derive"] } surf = "2.2.0" env_logger = "*" -async-std = { version="1.9.0", features=["attributes"] } +async-std = { version = "1.9.0", features = ["attributes"] } [workspace] members = [ - "packages/core-macro", "packages/core", + "packages/core-macro", "packages/html", + "packages/hooks", "packages/web", "packages/webview", - "packages/hooks", "packages/ssr", # "packages/atoms", # "packages/docsite", diff --git a/examples/reference/antipatterns.rs b/examples/reference/antipatterns.rs index 5ea2af648..008889586 100644 --- a/examples/reference/antipatterns.rs +++ b/examples/reference/antipatterns.rs @@ -85,7 +85,7 @@ static AntipatternNestedFragments: FC<()> = |cx| { /// recognize from the function signature, but Dioxus will not update the "live" version of state. Calling `set_state` /// merely places a new value in the queue and schedules the component for a future update. static AntipaternRelyingOnSetState: FC<()> = |cx| { - let (state, set_state) = use_state_classic(cx, || "Hello world"); + let (state, set_state) = use_state(cx, || "Hello world").classic(); set_state("New state"); // This will return false! `state` will *still* be "Hello world" assert!(state == &"New state"); @@ -126,7 +126,7 @@ static AntipatternMisusedHooks: FC = |cx| { if cx.should_render_state { // do not place a hook in the conditional! // prefer to move it out of the conditional - let (state, set_state) = use_state_classic(cx, || "hello world"); + let (state, set_state) = use_state(cx, || "hello world").classic(); rsx!(in cx, div { "{state}" }) } else { rsx!(in cx, div { "Not rendering state" }) diff --git a/examples/reference/empty.rs b/examples/reference/empty.rs index b60c2e74c..7afcd0f9e 100644 --- a/examples/reference/empty.rs +++ b/examples/reference/empty.rs @@ -3,10 +3,6 @@ //! //! This is a simple pattern that allows you to return no elements! -use dioxus::prelude::*; fn main() {} - -static Example: FC<()> = |cx| { - // - cx.render(rsx! {}) -}; +use dioxus::prelude::*; +static Example: FC<()> = |cx| cx.render(rsx! { Fragment {} }); diff --git a/examples/reference/fragments.rs b/examples/reference/fragments.rs index 848c5f4e8..3061ac838 100644 --- a/examples/reference/fragments.rs +++ b/examples/reference/fragments.rs @@ -35,11 +35,12 @@ static Example2: FC<()> = |cx| { // Using the `fragment` method on the NodeFactory static Example3: FC<()> = |cx| { - cx.render(LazyNodes::new(move |fac: &NodeFactory| { - fac.fragment_builder(None, |list| { - list.add_child(fac.text(format_args!("A"))) - .add_child(fac.text(format_args!("B"))) - .finish() - }) + cx.render(LazyNodes::new(move |fac| { + fac.fragment_from_iter([ + fac.text(format_args!("A")), + fac.text(format_args!("B")), + fac.text(format_args!("A")), + fac.text(format_args!("B")), + ]) })) }; diff --git a/examples/reference/iterators.rs b/examples/reference/iterators.rs index 27c7c0725..53591b41a 100644 --- a/examples/reference/iterators.rs +++ b/examples/reference/iterators.rs @@ -2,11 +2,11 @@ use dioxus::prelude::*; fn main() {} static Example: FC<()> = |cx| { - let (g, set_g) = use_state_classic(cx, || 0); + let g = use_state(cx, || 0); let v = (0..10).map(|f| { rsx! { li { - onclick: move |_| set_g(10) + onclick: move |_| g.set(10) } } }); diff --git a/examples/reference/listener.rs b/examples/reference/listener.rs index ce96931eb..2da21f954 100644 --- a/examples/reference/listener.rs +++ b/examples/reference/listener.rs @@ -11,11 +11,11 @@ fn main() {} /// We can use `set_name` in multiple closures; the closures automatically *copy* the reference to set_name. static ButtonList: FC<()> = |cx| { - let (name, set_name) = use_state_classic(cx, || "...?"); + let name = use_state(cx, || "...?"); let names = ["jack", "jill", "john", "jane"] .iter() - .map(move |n| rsx!(button { onclick: move |_| set_name(n), "{n}" })); + .map(move |n| rsx!(button { onclick: move |_| name.set(n), "{n}" })); cx.render(rsx!( div { diff --git a/examples/reference/suspense.rs b/examples/reference/suspense.rs index 2ce960f8f..fc35c795d 100644 --- a/examples/reference/suspense.rs +++ b/examples/reference/suspense.rs @@ -16,7 +16,7 @@ struct DogApi { const ENDPOINT: &str = "https://dog.ceo/api/breeds/image/random"; pub static App: FC<()> = |cx| { - let doggo = use_future_effect(&cx, move || async move { + let doggo = use_future_effect(cx, move || async move { match surf::get(ENDPOINT).recv_json::().await { Ok(res) => rsx!(in cx, img { src: "{res.message}" }), Err(_) => rsx!(in cx, div { "No doggos for you :(" }), @@ -31,29 +31,33 @@ pub static App: FC<()> = |cx| { )) }; -use dioxus_core::virtual_dom::SuspendedContext; +// use dioxus_core::virtual_dom::SuspendedContext; use futures::Future; use futures::FutureExt; use std::pin::Pin; -fn use_fetch<'a, T: serde::de::DeserializeOwned + 'static>( - cx: &impl Scoped<'a>, - url: &str, - g: impl FnOnce(SuspendedContext, surf::Result) -> VNode<'a> + 'a, -) -> VNode<'a> { - // essentially we're doing a "use_effect" but with no dependent props or post-render shenanigans - let fetch_promise = cx.use_hook( - move || surf::get(url).recv_json::().boxed_local(), - // just pass the future through - |p| p, - |_| (), - ); - cx.suspend(fetch_promise, g) + +fn use_fetch<'a, T, P, F>(cx: Context

, url: &str, g: F) -> VNode<'a> +where + T: serde::de::DeserializeOwned + 'static, + // F: FnOnce(SuspendedContext, surf::Result) -> VNode<'a> + 'a, + F: FnOnce((), surf::Result) -> VNode<'a> + 'a, +{ + todo!() + // // essentially we're doing a "use_effect" but with no dependent props or post-render shenanigans + // let fetch_promise = cx.use_hook( + // move || surf::get(url).recv_json::().boxed_local(), + // // just pass the future through + // |p| p, + // |_| (), + // ); + // cx.suspend(fetch_promise, g) } /// Spawns the future only when the inputs change -fn use_future_effect<'a, 'b, F: Future>>( - cx: &impl Scoped<'a>, - g: impl FnOnce() -> F + 'a, -) -> VNode<'a> { +fn use_future_effect<'a, 'b, F, P, F2>(cx: Context

, g: F2) -> VNode<'a> +where + F: Future>, + F2: FnOnce() -> F + 'a, +{ todo!() } diff --git a/examples/reference/webcomponents.rs b/examples/reference/webcomponents.rs index c27f8ff69..693a75c3c 100644 --- a/examples/reference/webcomponents.rs +++ b/examples/reference/webcomponents.rs @@ -14,8 +14,15 @@ use dioxus::{builder::ElementBuilder, prelude::NodeFactory}; fn main() {} -// TODO -struct MyEle<'a, 'b> { - el: ElementBuilder<'a, 'b>, - fac: &'b NodeFactory<'a>, +mod dioxus_elements { + use dioxus::prelude::DioxusElement; + + struct custom_element; + impl DioxusElement for custom_element { + const TAG_NAME: &'static str = "custom_element"; + const NAME_SPACE: Option<&'static str> = None; + } + + // Re-export the normal html namespace + pub use dioxus::prelude::dioxus_elements::*; } diff --git a/packages/atoms/examples/api_mvc.rs b/packages/atoms/_examples/api_mvc.rs similarity index 100% rename from packages/atoms/examples/api_mvc.rs rename to packages/atoms/_examples/api_mvc.rs diff --git a/packages/atoms/examples/callback.rs b/packages/atoms/_examples/callback.rs similarity index 100% rename from packages/atoms/examples/callback.rs rename to packages/atoms/_examples/callback.rs diff --git a/packages/atoms/examples/ecs.rs b/packages/atoms/_examples/ecs.rs similarity index 100% rename from packages/atoms/examples/ecs.rs rename to packages/atoms/_examples/ecs.rs diff --git a/packages/atoms/examples/family.rs b/packages/atoms/_examples/family.rs similarity index 100% rename from packages/atoms/examples/family.rs rename to packages/atoms/_examples/family.rs diff --git a/packages/atoms/examples/familypoc.rs b/packages/atoms/_examples/familypoc.rs similarity index 100% rename from packages/atoms/examples/familypoc.rs rename to packages/atoms/_examples/familypoc.rs diff --git a/packages/atoms/examples/hellorecoil.rs b/packages/atoms/_examples/hellorecoil.rs similarity index 100% rename from packages/atoms/examples/hellorecoil.rs rename to packages/atoms/_examples/hellorecoil.rs diff --git a/packages/atoms/examples/selectorlist.rs b/packages/atoms/_examples/selectorlist.rs similarity index 100% rename from packages/atoms/examples/selectorlist.rs rename to packages/atoms/_examples/selectorlist.rs diff --git a/packages/atoms/examples/selectors.rs b/packages/atoms/_examples/selectors.rs similarity index 100% rename from packages/atoms/examples/selectors.rs rename to packages/atoms/_examples/selectors.rs diff --git a/packages/atoms/examples/structured_app.rs b/packages/atoms/_examples/structured_app.rs similarity index 100% rename from packages/atoms/examples/structured_app.rs rename to packages/atoms/_examples/structured_app.rs diff --git a/packages/atoms/examples/supense_integration.rs b/packages/atoms/_examples/supense_integration.rs similarity index 100% rename from packages/atoms/examples/supense_integration.rs rename to packages/atoms/_examples/supense_integration.rs diff --git a/packages/atoms/examples/test.html b/packages/atoms/_examples/test.html similarity index 100% rename from packages/atoms/examples/test.html rename to packages/atoms/_examples/test.html diff --git a/packages/core-macro/src/htm.rs b/packages/core-macro/src/htm.rs index 8b10607f3..068a8009d 100644 --- a/packages/core-macro/src/htm.rs +++ b/packages/core-macro/src/htm.rs @@ -356,7 +356,9 @@ impl ToTokens for ToToksCtx<&TextNode> { fn to_tokens(&self, tokens: &mut TokenStream2) { let mut token_stream = TokenStream2::new(); self.recurse(&self.inner.0).to_tokens(&mut token_stream); - tokens.append_all(quote! {dioxus::builder::text3(bump, format_args_f!(#token_stream))}); + tokens.append_all(quote! { + __cx.text(format_args_f!(#token_stream)) + }); } } diff --git a/packages/core/Cargo.toml b/packages/core/Cargo.toml index 815f14414..3d258273f 100644 --- a/packages/core/Cargo.toml +++ b/packages/core/Cargo.toml @@ -11,10 +11,10 @@ description = "Core functionality for Dioxus - a concurrent renderer-agnostic Vi [dependencies] # todo: use wast for faster load/compile -dioxus-core-macro = { path="../core-macro", version="0.1.1" } +dioxus-core-macro = { path = "../core-macro", version = "0.1.1" } # Bumpalo is used as a micro heap backing each component -bumpalo = { version="3.6.0", features=["collections", "boxed"] } +bumpalo = { version = "3.6.0", features = ["collections", "boxed"] } # custom error type thiserror = "1" @@ -29,7 +29,7 @@ longest-increasing-subsequence = "0.1.0" log = "0.4" # # Serialize the Edits for use in Webview/Liveview instances -serde = { version="1", features=["derive"], optional=true } +serde = { version = "1", features = ["derive"], optional = true } # Backs scopes and unique keys slotmap = "1.0.3" @@ -38,12 +38,6 @@ appendlist = "1.4.0" futures-util = "0.3.15" -[dev-dependencies] -dioxus-html = { path="../html" } -dioxus-hooks = { path="../hooks" } -env_logger = "*" -# async-std = { version="1.9.0", features=["attributes"] } - [features] default = [] serialize = ["slotmap/serde", "serde"] diff --git a/packages/core/src/virtual_dom.rs b/packages/core/src/virtual_dom.rs index 5dc83c9d7..ea86c27ff 100644 --- a/packages/core/src/virtual_dom.rs +++ b/packages/core/src/virtual_dom.rs @@ -43,12 +43,12 @@ pub struct VirtualDom { /// The index of the root component /// Should always be the first (gen=0, id=0) - pub(crate) base_scope: ScopeIdx, + pub base_scope: ScopeIdx, /// All components dump their updates into a queue to be processed - pub(crate) event_queue: EventQueue, + pub event_queue: EventQueue, - pub(crate) tasks: TaskQueue, + pub tasks: TaskQueue, root_props: std::pin::Pin>, diff --git a/packages/hooks/Cargo.toml b/packages/hooks/Cargo.toml index 3696a9fa5..5780f7ef6 100644 --- a/packages/hooks/Cargo.toml +++ b/packages/hooks/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -dioxus-core = { path = "../core" } +dioxus-core = { path = "../../packages/core", version = "*" } diff --git a/packages/hooks/src/lib.rs b/packages/hooks/src/lib.rs index b3463a950..97c759b33 100644 --- a/packages/hooks/src/lib.rs +++ b/packages/hooks/src/lib.rs @@ -1,2 +1,2 @@ mod usestate; -pub use usestate::{use_state, UseState}; +pub use usestate::use_state;