thaw/src/menu/mod.rs

46 lines
1.1 KiB
Rust
Raw Normal View History

2023-05-18 17:14:54 +08:00
mod menu_item;
use leptos::*;
pub use menu_item::*;
#[component]
2023-08-29 09:11:22 +08:00
pub fn Menu(#[prop(into)] selected: RwSignal<String>, children: Children) -> impl IntoView {
let menu_injection_key = create_rw_signal(MenuInjectionKey::new(selected.get()));
create_effect(move |_| {
2023-05-24 23:51:09 +08:00
let selected_key = selected.get();
let key = menu_injection_key.get_untracked();
if selected_key != key.value {
menu_injection_key.set(MenuInjectionKey::new(selected_key));
}
});
2023-08-29 09:11:22 +08:00
create_effect(move |_| {
2023-05-24 23:51:09 +08:00
let selected_key = selected.get_untracked();
let key = menu_injection_key.get();
if selected_key != key.value {
selected.set(key.value);
}
});
2023-08-29 09:11:22 +08:00
provide_context(menu_injection_key);
view! {
2023-05-18 17:14:54 +08:00
<div class="melt-menu">
2023-08-29 09:11:22 +08:00
{ children() }
2023-05-18 17:14:54 +08:00
</div>
}
}
#[derive(Clone)]
pub struct MenuInjectionKey {
2023-05-24 23:51:09 +08:00
value: String,
2023-05-18 17:14:54 +08:00
}
impl MenuInjectionKey {
2023-05-24 23:51:09 +08:00
pub fn new(value: String) -> Self {
2023-05-18 17:14:54 +08:00
Self { value }
}
}
2023-08-29 09:11:22 +08:00
pub fn use_menu() -> RwSignal<MenuInjectionKey> {
use_context::<RwSignal<MenuInjectionKey>>().expect("MenuInjectionKey not exist")
2023-05-18 17:14:54 +08:00
}