use dioxus::prelude::*; use crate::{routable::Routable, utils::use_router_internal::use_router_internal}; pub(crate) struct OutletContext { pub current_level: usize, pub _marker: std::marker::PhantomData, } 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: 1, _marker: std::marker::PhantomData, }) }); outlet_context } 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: &OutletContext = use_outlet_context(cx); let current_level = outlet.current_level; cx.provide_context({ OutletContext:: { current_level: current_level + 1, _marker: std::marker::PhantomData, } }); if let Some(error) = router.render_error(cx) { if current_level == 0 { return Some(error); } else { return None; } } router.current().render(cx, current_level) } }