outlet.rs 852 B

1234567891011121314151617181920212223242526272829303132
  1. use dioxus::prelude::*;
  2. use crate::{hooks::use_route, routable::Routable};
  3. #[derive(Clone)]
  4. pub(crate) struct OutletContext {
  5. pub current_level: usize,
  6. }
  7. pub(crate) fn use_outlet_context(cx: &ScopeState) -> &OutletContext {
  8. let outlet_context = cx.use_hook(|| {
  9. cx.consume_context()
  10. .unwrap_or(OutletContext { current_level: 0 })
  11. });
  12. outlet_context
  13. }
  14. impl OutletContext {
  15. pub(crate) fn render<R: Routable + Clone>(cx: &ScopeState) -> Element<'_> {
  16. let outlet = use_outlet_context(cx);
  17. let current_level = outlet.current_level;
  18. cx.provide_context({
  19. OutletContext {
  20. current_level: current_level + 1,
  21. }
  22. });
  23. use_route::<R>(cx)
  24. .expect("Outlet must be inside of a router")
  25. .render(cx, current_level)
  26. }
  27. }