From 128f3e442568bb24422a939c255b956fde8082da Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 13 Jul 2023 19:29:43 -0700 Subject: [PATCH] fix nested routers --- .../examples/axum-hello-world/src/main.rs | 6 ++-- packages/router/src/components/outlet.rs | 2 +- packages/router/src/contexts/outlet.rs | 33 ++++++++++++++----- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/fullstack/examples/axum-hello-world/src/main.rs b/packages/fullstack/examples/axum-hello-world/src/main.rs index 0aea86e87..739a24b1c 100644 --- a/packages/fullstack/examples/axum-hello-world/src/main.rs +++ b/packages/fullstack/examples/axum-hello-world/src/main.rs @@ -41,10 +41,8 @@ fn app(cx: Scope) -> Element { } #[server(PostServerData)] -async fn post_server_data( - #[extract] axum::extract::Host(host): axum::extract::Host, - data: String, -) -> Result<(), ServerFnError> { +async fn post_server_data(data: String) -> Result<(), ServerFnError> { + let axum::extract::Host(host): axum::extract::Host = extract()?; println!("Server received: {}", data); println!("{:?}", host); diff --git a/packages/router/src/components/outlet.rs b/packages/router/src/components/outlet.rs index b358f5180..da312402e 100644 --- a/packages/router/src/components/outlet.rs +++ b/packages/router/src/components/outlet.rs @@ -68,5 +68,5 @@ use dioxus::prelude::*; /// # assert_eq!(dioxus_ssr::render(&vdom), "

App

Child

"); /// ``` pub fn GenericOutlet(cx: Scope) -> Element { - OutletContext::render::(cx) + OutletContext::::render(cx) } diff --git a/packages/router/src/contexts/outlet.rs b/packages/router/src/contexts/outlet.rs index 421f1640b..b05db4c9c 100644 --- a/packages/router/src/contexts/outlet.rs +++ b/packages/router/src/contexts/outlet.rs @@ -2,29 +2,44 @@ use dioxus::prelude::*; use crate::{routable::Routable, utils::use_router_internal::use_router_internal}; -#[derive(Clone)] -pub(crate) struct OutletContext { +pub(crate) struct OutletContext { pub current_level: usize, + _marker: std::marker::PhantomData, } -pub(crate) fn use_outlet_context(cx: &ScopeState) -> &OutletContext { +impl Clone for OutletContext { + fn clone(&self) -> Self { + OutletContext { + current_level: self.current_level, + _marker: std::marker::PhantomData, + } + } +} + +pub(crate) fn use_outlet_context(cx: &ScopeState) -> &OutletContext { let outlet_context = cx.use_hook(|| { - cx.consume_context() - .unwrap_or(OutletContext { current_level: 0 }) + cx.consume_context().unwrap_or(OutletContext:: { + current_level: 0, + _marker: std::marker::PhantomData, + }) }); outlet_context } -impl OutletContext { - pub(crate) fn render(cx: Scope) -> Element<'_> { +impl OutletContext { + pub(crate) fn render(cx: Scope) -> Element<'_> + where + R: Routable + Clone, + { let router = use_router_internal::(cx) .as_ref() .expect("Outlet must be inside of a router"); - let outlet = use_outlet_context(cx); + let outlet: &OutletContext = use_outlet_context(cx); let current_level = outlet.current_level; cx.provide_context({ - OutletContext { + OutletContext:: { current_level: current_level + 1, + _marker: std::marker::PhantomData, } });