From b58eb0427816b88b8ed42e1ee84373b945d56bf2 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 16 Jan 2024 14:39:48 -0600 Subject: [PATCH] Fix basic routers --- examples/query_segments_demo/src/main.rs | 11 +++---- examples/router.rs | 2 -- packages/core/src/global_context.rs | 5 +-- packages/dioxus-lib/Cargo.toml | 2 +- packages/dioxus/src/lib.rs | 1 + .../router/src/utils/use_router_internal.rs | 32 ++++++++----------- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/examples/query_segments_demo/src/main.rs b/examples/query_segments_demo/src/main.rs index 618c7acf2..2e70ef7fc 100644 --- a/examples/query_segments_demo/src/main.rs +++ b/examples/query_segments_demo/src/main.rs @@ -10,7 +10,6 @@ use std::fmt::Display; use dioxus::prelude::*; use dioxus_router::prelude::*; -// ANCHOR: route #[derive(Routable, Clone)] #[rustfmt::skip] enum Route { @@ -65,22 +64,22 @@ impl FromQuery for ManualBlogQuerySegments { #[component] fn BlogPost(query_params: ManualBlogQuerySegments) -> Element { rsx! { - div{"This is your blogpost with a query segment:"} - div{ "{query_params:?}" } + div { "This is your blogpost with a query segment:" } + div { "{query_params:?}" } } } #[component] fn AutomaticBlogPost(name: String, surname: String) -> Element { rsx! { - div{"This is your blogpost with a query segment:"} - div{ "name={name}&surname={surname}" } + div { "This is your blogpost with a query segment:" } + div { "name={name}&surname={surname}" } } } #[component] fn App() -> Element { - rsx! { Router::{} } + rsx! { Router:: {} } } fn main() { diff --git a/examples/router.rs b/examples/router.rs index 5a28b54ac..4f4d79257 100644 --- a/examples/router.rs +++ b/examples/router.rs @@ -5,7 +5,6 @@ fn main() { launch_desktop(Route::Home {}); } -// ANCHOR: router #[derive(Routable, Clone)] #[rustfmt::skip] enum Route { @@ -30,7 +29,6 @@ enum Route { route: Vec, }, } -// ANCHOR_END: router #[component] fn NavBar() -> Element { diff --git a/packages/core/src/global_context.rs b/packages/core/src/global_context.rs index d4d6d533a..b26214469 100644 --- a/packages/core/src/global_context.rs +++ b/packages/core/src/global_context.rs @@ -27,10 +27,7 @@ pub fn try_consume_context() -> Option { pub fn consume_context() -> T { with_current_scope(|cx| cx.consume_context::()) .flatten() - .expect(&format!( - "Could not find context {}", - std::any::type_name::(), - )) + .unwrap_or_else(|| panic!("Could not find context {}", std::any::type_name::())) } /// Consume context from the current scope diff --git a/packages/dioxus-lib/Cargo.toml b/packages/dioxus-lib/Cargo.toml index 6e5977a12..6dcd58554 100644 --- a/packages/dioxus-lib/Cargo.toml +++ b/packages/dioxus-lib/Cargo.toml @@ -20,7 +20,7 @@ dioxus-rsx = { workspace = true, optional = true } dioxus-signals = { workspace = true, optional = true } [features] -default = ["macro", "html", "signals"] +default = ["macro", "html", "signals", "hooks"] signals = ["dioxus-signals"] macro = ["dioxus-core-macro", "dioxus-rsx"] html = ["dioxus-html"] diff --git a/packages/dioxus/src/lib.rs b/packages/dioxus/src/lib.rs index f3f789dcc..8d85b9dd5 100644 --- a/packages/dioxus/src/lib.rs +++ b/packages/dioxus/src/lib.rs @@ -28,6 +28,7 @@ pub use dioxus_rsx as rsx; pub use dioxus_core_macro as core_macro; pub mod prelude { + #[cfg(feature = "launch")] pub use crate::launch::*; diff --git a/packages/router/src/utils/use_router_internal.rs b/packages/router/src/utils/use_router_internal.rs index b463e89b7..980879b31 100644 --- a/packages/router/src/utils/use_router_internal.rs +++ b/packages/router/src/utils/use_router_internal.rs @@ -1,4 +1,4 @@ -use dioxus_lib::prelude::ScopeId; +use dioxus_lib::prelude::*; use crate::prelude::*; @@ -11,26 +11,22 @@ use crate::prelude::*; /// - [`None`], when the current component isn't a descendant of a [`Link`] component. /// - Otherwise [`Some`]. pub(crate) fn use_router_internal() -> Option { - todo!() + let router = use_hook(|| { + let router = consume_context::(); - // let inner = cx.use_hook(|| { - // let router = cx.consume_context::()?; + let id = current_scope_id().expect("use_router_internal called outside of a component"); + router.subscribe(id); - // let id = cx.scope_id(); - // router.subscribe(id); + Some(router) + }); - // Some(Subscription { router, id }) - // }); - // cx.use_hook(|| inner.as_ref().map(|s| s.router.clone())) -} + use_on_destroy(|| { + let router = consume_context::(); -struct Subscription { - router: RouterContext, - id: ScopeId, -} + let id = current_scope_id().expect("use_router_internal called outside of a component"); -impl Drop for Subscription { - fn drop(&mut self) { - self.router.unsubscribe(self.id); - } + router.unsubscribe(id); + }); + + router }