From 3e86c0e3647c8a0d074a2985ce2211be21bbd958 Mon Sep 17 00:00:00 2001 From: Adrian Wannenmacher Date: Tue, 13 Dec 2022 10:59:25 +0100 Subject: [PATCH] make nested use_router calls behave correctly --- packages/router/src/hooks/use_router.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/router/src/hooks/use_router.rs b/packages/router/src/hooks/use_router.rs index 4ae01b524..7c46c43dc 100644 --- a/packages/router/src/hooks/use_router.rs +++ b/packages/router/src/hooks/use_router.rs @@ -5,6 +5,7 @@ use dioxus_router_core::{ routes::{ContentAtom, Segment}, Navigator, RouterService, RouterState, RoutingCallback, }; +use log::error; use crate::{ contexts::router::RouterContext, @@ -29,9 +30,9 @@ use crate::{ /// state, see the [`use_route`](super::use_route) hook. For more information about the /// [`Navigator`], see its own documentation and the [`use_navigate`](super::use_navigate) hook. /// -// # Panic -// - When used within a component, that is nested inside another component calling [`use_router`], -// but only in debug builds. +/// # Panic +/// - When used within a component, that is nested inside another component calling [`use_router`], +/// but only in debug builds. /// /// # Example /// ```rust,no_run @@ -71,7 +72,14 @@ pub fn use_router<'a>( Navigator, ) { let (service, state, sender) = cx.use_hook(|| { - // todo: ensure no router context is found + #[allow(unreachable_code, unused_variables)] + if let Some(outer) = cx.consume_context::() { + let msg = "components using `use_router` should not be nested within each other"; + error!("{msg}, inner will be inactive and transparent"); + #[cfg(debug_assertions)] + panic!("{}", msg); + return (None, outer.state, outer.sender); + } let cfg = cfg(); let content = content();