use dioxus_lib::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() -> OutletContext { use_hook(|| { try_consume_context().unwrap_or(OutletContext:: { current_level: 1, _marker: std::marker::PhantomData, }) }) } impl OutletContext { pub(crate) fn render() -> Element where R: Routable + Clone, { let router = use_router_internal().expect("Outlet must be inside of a router"); let outlet: OutletContext = use_outlet_context(); let current_level = outlet.current_level; provide_context({ OutletContext:: { current_level: current_level + 1, _marker: std::marker::PhantomData, } }); if let Some(error) = router.render_error() { return if current_level == 0 { error } else { VNode::empty() }; } router.current::().render(current_level) } }