mod menu_group; mod menu_item; mod theme; use crate::utils::maybe_rw_signal::MaybeRwSignal; use leptos::*; pub use menu_group::MenuGroup; pub use menu_item::*; pub use theme::MenuTheme; #[component] pub fn Menu( #[prop(optional, into)] value: MaybeRwSignal, children: Children, ) -> impl IntoView { let menu_injection_key = create_rw_signal(MenuInjectionKey::new(value.get_untracked())); create_effect(move |_| { let selected_key = value.get(); let key = menu_injection_key.get_untracked(); if selected_key != key.value { menu_injection_key.set(MenuInjectionKey::new(selected_key)); } }); create_effect(move |_| { let selected_key = value.get_untracked(); let key = menu_injection_key.get(); if selected_key != key.value { value.set(key.value); } }); provide_context(menu_injection_key); view! {
{children()}
} } #[derive(Clone)] pub struct MenuInjectionKey { value: String, } impl MenuInjectionKey { pub fn new(value: String) -> Self { Self { value } } } pub fn use_menu() -> RwSignal { expect_context::>() }