patternfly_yew/components/nav/
router.rs

1use super::*;
2use crate::hooks::id::use_random_id;
3use yew::prelude::*;
4use yew_nested_router::{components::Link, prelude::*};
5
6// nav router item
7
8/// Properties for [`NavRouterItem`]
9#[derive(Clone, PartialEq, Properties)]
10pub struct NavRouterItemProperties<R>
11where
12    R: Target,
13{
14    #[prop_or_default]
15    pub children: Html,
16    pub to: R,
17
18    #[prop_or_default]
19    pub predicate: Option<Callback<R, bool>>,
20}
21
22/// A navigation item, using the Router.
23#[function_component(NavRouterItem)]
24pub fn nav_router_item<R>(props: &NavRouterItemProperties<R>) -> Html
25where
26    R: Target,
27{
28    let router = use_router().expect("Requires a Router or Nested router");
29
30    let mut classes = Classes::from("pf-v5-c-nav__link");
31
32    let active = router.is_active(&props.to, props.predicate.as_ref());
33
34    let id = use_random_id();
35
36    let expandable = use_expandable();
37    use_effect_with(active, move |_| {
38        if let Some(expandable) = expandable {
39            expandable.state(*id, active)
40        }
41    });
42
43    if active {
44        classes.push("pf-m-current");
45    }
46
47    html! {
48        <li class="pf-v5-c-nav__item">
49            <Link<R> to={props.to.clone()} class={classes}>
50                { props.children.clone() }
51            </Link<R>>
52        </li>
53    }
54}