diff --git a/example-projects/ecommerce-site/src/components/home.rs b/example-projects/ecommerce-site/src/components/home.rs index 11006472a7..afc6691122 100644 --- a/example-projects/ecommerce-site/src/components/home.rs +++ b/example-projects/ecommerce-site/src/components/home.rs @@ -8,7 +8,7 @@ use crate::{ use dioxus::prelude::*; pub(crate) fn Home() -> Element { - let products = use_server_future(|| fetch_products(10, Sort::Ascending))?; + let products = use_hydration_resource(|| fetch_products(10, Sort::Ascending))?; let products = products().unwrap()?; rsx! { diff --git a/example-projects/ecommerce-site/src/components/product_page.rs b/example-projects/ecommerce-site/src/components/product_page.rs index 18f8f91edc..45d14c3a25 100644 --- a/example-projects/ecommerce-site/src/components/product_page.rs +++ b/example-projects/ecommerce-site/src/components/product_page.rs @@ -40,7 +40,7 @@ pub fn product_page(product_id: ReadSignal) -> Element { let mut quantity = use_signal(|| 1); let mut size = use_signal(Size::default); - let product = use_server_future(move || fetch_product(product_id()))?; + let product = use_hydration_resource(move || fetch_product(product_id()))?; let Product { title, diff --git a/example-projects/fullstack-hackernews/src/main.rs b/example-projects/fullstack-hackernews/src/main.rs index ec389d371d..9e1765fdf3 100644 --- a/example-projects/fullstack-hackernews/src/main.rs +++ b/example-projects/fullstack-hackernews/src/main.rs @@ -61,7 +61,7 @@ fn Homepage(story: ReadSignal) -> Element { #[component] fn Stories() -> Element { - let stories: Resource>> = use_server_future(move || async move { + let stories: Resource>> = use_hydration_resource(move || async move { let url = format!("{}topstories.json", BASE_API_URL); let mut stories_ids = reqwest::get(&url).await?.json::>().await?; stories_ids.truncate(30); @@ -85,7 +85,7 @@ fn Stories() -> Element { #[component] fn StoryListing(story: ReadSignal) -> Element { - let story = use_server_future(move || get_story(story()))?; + let story = use_hydration_resource(move || get_story(story()))?; let StoryItem { title, @@ -175,7 +175,7 @@ fn Preview(story: ReadSignal) -> Element { return rsx! {"Click on a story to preview it here"}; }; - let story = use_server_future(use_reactive!(|id| get_story(id)))?; + let story = use_hydration_resource(use_reactive!(|id| get_story(id)))?; let story = story().unwrap()?; @@ -196,7 +196,7 @@ fn Preview(story: ReadSignal) -> Element { #[component] fn Comment(comment: i64) -> Element { let comment: Resource> = - use_server_future(use_reactive!(|comment| async move { + use_hydration_resource(use_reactive!(|comment| async move { let url = format!("{}{}{}.json", BASE_API_URL, ITEM_API, comment); let mut comment = reqwest::get(&url).await?.json::().await?; Ok(comment) diff --git a/examples/fullstack-hello-world/src/main.rs b/examples/fullstack-hello-world/src/main.rs index d86a0d8911..4eee41a5b7 100644 --- a/examples/fullstack-hello-world/src/main.rs +++ b/examples/fullstack-hello-world/src/main.rs @@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize}; fn app() -> Element { let mut count = use_signal(|| 0); let mut text = use_signal(|| "...".to_string()); - let server_future = use_server_future(get_server_data)?; + let server_future = use_hydration_resource(get_server_data)?; rsx! { document::Link { href: asset!("/assets/hello.css"), rel: "stylesheet" } diff --git a/packages/dioxus/src/lib.rs b/packages/dioxus/src/lib.rs index c64edd25eb..bb78a1d35b 100644 --- a/packages/dioxus/src/lib.rs +++ b/packages/dioxus/src/lib.rs @@ -200,7 +200,8 @@ pub mod prelude { #[cfg_attr(docsrs, doc(cfg(feature = "fullstack")))] #[doc(inline)] pub use dioxus_fullstack::{ - server, server_fn, use_server_cached, use_server_future, ServerFnError, ServerFnResult, + server, server_fn, use_hydration_hook, use_hydration_resource, ServerFnError, + ServerFnResult, }; #[cfg(feature = "server")] diff --git a/packages/fullstack-hooks/README.md b/packages/fullstack-hooks/README.md index f025fd32c3..3bf8848c70 100644 --- a/packages/fullstack-hooks/README.md +++ b/packages/fullstack-hooks/README.md @@ -10,7 +10,7 @@ To start using this crate, you can run the following command: cargo add dioxus-fullstack-hooks ``` -Then you can use hooks like `use_server_future` in your components: +Then you can use hooks like `use_hydration_resource` in your components: ```rust use dioxus::prelude::*; @@ -20,10 +20,10 @@ async fn fetch_article(id: u32) -> String { fn App() -> Element { let mut article_id = use_signal(|| 0); - // `use_server_future` will spawn a task that runs on the server and serializes the result to send to the client. + // `use_hydration_resource` will spawn a task that runs on the server and serializes the result to send to the client. // The future will rerun any time the // Since we bubble up the suspense with `?`, the server will wait for the future to resolve before rendering - let article = use_server_future(move || fetch_article(article_id()))?; + let article = use_hydration_resource(move || fetch_article(article_id()))?; rsx! { "{article().unwrap()}" diff --git a/packages/fullstack-hooks/src/hooks/server_cached.rs b/packages/fullstack-hooks/src/hooks/hydration_hook.rs similarity index 93% rename from packages/fullstack-hooks/src/hooks/server_cached.rs rename to packages/fullstack-hooks/src/hooks/hydration_hook.rs index fdf394c020..44d8999753 100644 --- a/packages/fullstack-hooks/src/hooks/server_cached.rs +++ b/packages/fullstack-hooks/src/hooks/hydration_hook.rs @@ -16,7 +16,7 @@ use serde::{de::DeserializeOwned, Serialize}; /// use dioxus::prelude::*; /// /// fn app() -> Element { -/// let state1 = use_server_cached(|| { +/// let state1 = use_hydration_hook(|| { /// 1234 /// }); /// @@ -24,7 +24,7 @@ use serde::{de::DeserializeOwned, Serialize}; /// } /// ``` #[track_caller] -pub fn use_server_cached( +pub fn use_hydration_hook( server_fn: impl Fn() -> O, ) -> O { let location = std::panic::Location::caller(); diff --git a/packages/fullstack-hooks/src/hooks/server_future.rs b/packages/fullstack-hooks/src/hooks/hydration_resource.rs similarity index 90% rename from packages/fullstack-hooks/src/hooks/server_future.rs rename to packages/fullstack-hooks/src/hooks/hydration_resource.rs index 6937341e08..84966ccab1 100644 --- a/packages/fullstack-hooks/src/hooks/server_future.rs +++ b/packages/fullstack-hooks/src/hooks/hydration_resource.rs @@ -16,17 +16,17 @@ use std::future::Future; /// /// ```rust, no_run /// # use dioxus::prelude::*; -/// // ❌ The future inside of use_server_future is not reactive +/// // ❌ The future inside of use_hydration_resource is not reactive /// let id = use_signal(|| 0); -/// use_server_future(move || { +/// use_hydration_resource(move || { /// async move { /// // But the future is not reactive which means that the future will not subscribe to any reads here /// println!("{id}"); /// } /// }); -/// // ✅ The closure that creates the future for use_server_future is reactive +/// // ✅ The closure that creates the future for use_hydration_resource is reactive /// let id = use_signal(|| 0); -/// use_server_future(move || { +/// use_hydration_resource(move || { /// // The closure itself is reactive which means the future will subscribe to any signals you read here /// let cloned_id = id(); /// async move { @@ -47,10 +47,10 @@ use std::future::Future; /// /// fn App() -> Element { /// let mut article_id = use_signal(|| 0); -/// // `use_server_future` will spawn a task that runs on the server and serializes the result to send to the client. +/// // `use_hydration_resource` will spawn a task that runs on the server and serializes the result to send to the client. /// // The future will rerun any time the /// // Since we bubble up the suspense with `?`, the server will wait for the future to resolve before rendering -/// let article = use_server_future(move || fetch_article(article_id()))?; +/// let article = use_hydration_resource(move || fetch_article(article_id()))?; /// /// rsx! { /// "{article().unwrap()}" @@ -59,7 +59,7 @@ use std::future::Future; /// ``` #[must_use = "Consider using `cx.spawn` to run a future without reading its value"] #[track_caller] -pub fn use_server_future( +pub fn use_hydration_resource( mut future: impl FnMut() -> F + 'static, ) -> Result, RenderError> where diff --git a/packages/fullstack-hooks/src/hooks/mod.rs b/packages/fullstack-hooks/src/hooks/mod.rs index 4de7ac9679..3c46eb3e2f 100644 --- a/packages/fullstack-hooks/src/hooks/mod.rs +++ b/packages/fullstack-hooks/src/hooks/mod.rs @@ -1,4 +1,4 @@ -mod server_cached; -pub use server_cached::*; -mod server_future; -pub use server_future::*; +mod hydration_hook; +pub use hydration_hook::*; +mod hydration_resource; +pub use hydration_resource::*; diff --git a/packages/playwright-tests/default-features-disabled/src/main.rs b/packages/playwright-tests/default-features-disabled/src/main.rs index ded9a7e7a9..7e09dcee1d 100644 --- a/packages/playwright-tests/default-features-disabled/src/main.rs +++ b/packages/playwright-tests/default-features-disabled/src/main.rs @@ -9,7 +9,9 @@ fn main() { } fn app() -> Element { - let server_features = use_server_future(get_server_features)?.unwrap().unwrap(); + let server_features = use_hydration_resource(get_server_features)? + .unwrap() + .unwrap(); let mut client_features = use_signal(Vec::new); use_effect(move || { diff --git a/packages/playwright-tests/fullstack/src/main.rs b/packages/playwright-tests/fullstack/src/main.rs index f76a3ba616..1bd5db0ef9 100644 --- a/packages/playwright-tests/fullstack/src/main.rs +++ b/packages/playwright-tests/fullstack/src/main.rs @@ -66,7 +66,7 @@ fn OnMounted() -> Element { #[component] fn DefaultServerFnCodec() -> Element { - let resource = use_server_future(|| get_server_data_empty_vec(Vec::new()))?; + let resource = use_hydration_resource(|| get_server_data_empty_vec(Vec::new()))?; let empty_vec = resource.unwrap().unwrap(); assert!(empty_vec.is_empty()); @@ -138,7 +138,7 @@ fn Errors() -> Element { #[component] pub fn ThrowsError() -> Element { - use_server_future(server_error)?.unwrap()?; + use_hydration_resource(server_error)?.unwrap()?; rsx! { "success" } diff --git a/packages/playwright-tests/nested-suspense/src/lib.rs b/packages/playwright-tests/nested-suspense/src/lib.rs index 4d7d351f31..2173361959 100644 --- a/packages/playwright-tests/nested-suspense/src/lib.rs +++ b/packages/playwright-tests/nested-suspense/src/lib.rs @@ -40,7 +40,7 @@ fn MessageWithLoader(id: usize) -> Element { #[component] fn LoadTitle() -> Element { - let title = use_server_future(move || server_content(0))?() + let title = use_hydration_resource(move || server_content(0))?() .unwrap() .unwrap(); @@ -52,7 +52,7 @@ fn LoadTitle() -> Element { #[component] fn Message(id: usize) -> Element { - let message = use_server_future(move || server_content(id))?() + let message = use_hydration_resource(move || server_content(id))?() .unwrap() .unwrap(); diff --git a/packages/playwright-tests/suspense-carousel/src/main.rs b/packages/playwright-tests/suspense-carousel/src/main.rs index 17965b9d2e..46a7f8faa4 100644 --- a/packages/playwright-tests/suspense-carousel/src/main.rs +++ b/packages/playwright-tests/suspense-carousel/src/main.rs @@ -59,7 +59,7 @@ impl ResolvedOn { #[component] fn SuspendedComponent(id: i32) -> Element { - let resolved_on = use_server_future(move || async move { + let resolved_on = use_hydration_resource(move || async move { async_std::task::sleep(std::time::Duration::from_secs(1)).await; ResolvedOn::CURRENT })?() @@ -90,7 +90,7 @@ fn SuspendedComponent(id: i32) -> Element { #[component] fn NestedSuspendedComponent(id: i32) -> Element { - let resolved_on = use_server_future(move || async move { + let resolved_on = use_hydration_resource(move || async move { async_std::task::sleep(std::time::Duration::from_secs(1)).await; ResolvedOn::CURRENT })?() diff --git a/packages/server/src/render.rs b/packages/server/src/render.rs index ffbac12dc6..e6505a38ad 100644 --- a/packages/server/src/render.rs +++ b/packages/server/src/render.rs @@ -231,7 +231,7 @@ impl SsrRendererPool { break; } - // Wait for new async work that runs during suspense (mainly use_server_futures) + // Wait for new async work that runs during suspense (mainly use_hydration_resources) virtual_dom.wait_for_suspense_work().await; // Do that async work @@ -679,8 +679,8 @@ impl FullstackHTMLTemplate { ) -> Result<(), dioxus_isrg::IncrementalRendererError> { let ServeConfig { index, .. } = &self.cfg; - // Collect the initial server data from the root node. For most apps, no use_server_futures will be resolved initially, so this will be full on `None`s. - // Sending down those Nones are still important to tell the client not to run the use_server_futures that are already running on the backend + // Collect the initial server data from the root node. For most apps, no use_hydration_resources will be resolved initially, so this will be full on `None`s. + // Sending down those Nones are still important to tell the client not to run the use_hydration_resources that are already running on the backend let resolved_data = serialize_server_data(virtual_dom, ScopeId::ROOT); // We always send down the data required to hydrate components on the client let raw_data = resolved_data.data;