thaw/src/menu/mod.rs

50 lines
1.2 KiB
Rust
Raw Normal View History

2023-10-05 00:58:53 +08:00
mod menu_group;
2023-05-18 17:14:54 +08:00
mod menu_item;
2023-09-21 21:57:34 +08:00
mod theme;
2023-05-18 17:14:54 +08:00
2023-10-06 16:53:57 +08:00
use crate::utils::maybe_rw_signal::MaybeRwSignal;
2023-05-18 17:14:54 +08:00
use leptos::*;
2023-10-05 00:58:53 +08:00
pub use menu_group::MenuGroup;
2023-05-18 17:14:54 +08:00
pub use menu_item::*;
2023-09-21 21:57:34 +08:00
pub use theme::MenuTheme;
2023-05-18 17:14:54 +08:00
#[component]
2023-10-06 16:53:57 +08:00
pub fn Menu(
2023-10-11 21:25:11 +08:00
#[prop(optional, into)] value: MaybeRwSignal<String>,
2023-10-06 16:53:57 +08:00
children: Children,
) -> impl IntoView {
2023-10-11 21:25:11 +08:00
let menu_injection_key = create_rw_signal(MenuInjectionKey::new(value.get_untracked()));
2023-08-29 09:11:22 +08:00
create_effect(move |_| {
2023-10-11 21:25:11 +08:00
let selected_key = value.get();
2023-05-24 23:51:09 +08:00
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-10-11 21:25:11 +08:00
let selected_key = value.get_untracked();
2023-05-24 23:51:09 +08:00
let key = menu_injection_key.get();
if selected_key != key.value {
2023-10-11 21:25:11 +08:00
value.set(key.value);
2023-05-24 23:51:09 +08:00
}
});
2023-08-29 09:11:22 +08:00
provide_context(menu_injection_key);
2023-10-08 09:28:13 +08:00
view! { <div class="melt-menu">{children()}</div> }
2023-05-18 17:14:54 +08:00
}
#[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> {
2023-10-12 17:40:21 +08:00
expect_context::<RwSignal<MenuInjectionKey>>()
2023-05-18 17:14:54 +08:00
}