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