use dioxus::prelude::*;
use crate::icon::{Icon, IconKind};
#[derive(Props, Clone, PartialEq)]
pub struct SidebarMenuProps {
#[props(default)]
pub title: Option<String>,
#[props(default)]
pub collapsible: bool,
#[props(default)]
pub opened: Option<Signal<bool>>,
#[props(default = true)]
pub default_opened: bool,
#[props(default)]
pub class: String,
pub children: Element,
}
#[component]
pub fn SidebarMenu(props: SidebarMenuProps) -> Element {
let mut local_opened = use_signal(|| props.default_opened);
let is_open = props.opened.map(|sig| sig()).unwrap_or(local_opened());
let toggle = move |_| {
if props.collapsible {
if let Some(mut sig) = props.opened {
sig.set(!is_open);
} else {
local_opened.set(!is_open);
}
}
};
rsx! {
div { class: "sd-sidebar-menu {props.class}",
if let Some(ref title) = props.title {
if props.collapsible {
button {
r#type: "button",
class: "sd-sidebar-menu__header sd-sidebar-menu__header--collapsible",
onclick: toggle,
span { class: "sd-sidebar-menu__title", "{title}" }
span {
class: if is_open { "sd-sidebar-menu__chevron sd-sidebar-menu__chevron--open" } else { "sd-sidebar-menu__chevron" },
Icon { kind: IconKind::ChevronDown, size: 12 }
}
}
} else {
div { class: "sd-sidebar-menu__header",
span { class: "sd-sidebar-menu__title", "{title}" }
}
}
}
if is_open {
div { class: "sd-sidebar-menu__content",
{props.children}
}
}
}
}
}