patternfly_yew/components/nav/
router.rs1use super::*;
2use crate::hooks::id::use_random_id;
3use yew::prelude::*;
4use yew_nested_router::{components::Link, prelude::*};
5
6#[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#[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}