2023-11-08 11:02:38 +08:00
|
|
|
mod installation;
|
|
|
|
mod usage;
|
|
|
|
|
|
|
|
use crate::components::SiteHeader;
|
|
|
|
pub use installation::*;
|
|
|
|
use leptos::*;
|
|
|
|
use leptos_router::{use_location, use_navigate, Outlet};
|
|
|
|
use thaw::*;
|
|
|
|
pub use usage::*;
|
|
|
|
|
|
|
|
#[component]
|
|
|
|
pub fn GuidePage() -> impl IntoView {
|
|
|
|
let navigate = use_navigate();
|
|
|
|
let selected = create_rw_signal({
|
|
|
|
let loaction = use_location();
|
|
|
|
let mut pathname = loaction.pathname.get_untracked();
|
|
|
|
|
|
|
|
if pathname.starts_with("/thaw/guide/") {
|
|
|
|
pathname.drain(12..).collect()
|
|
|
|
} else {
|
|
|
|
String::new()
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
create_effect(move |value| {
|
|
|
|
let selected = selected.get();
|
|
|
|
if value.is_some() {
|
|
|
|
navigate(&format!("/guide/{selected}"), Default::default());
|
|
|
|
}
|
|
|
|
selected
|
|
|
|
});
|
|
|
|
view! {
|
|
|
|
<Layout position=LayoutPosition::Absolute>
|
|
|
|
<SiteHeader/>
|
|
|
|
<Layout has_sider=true position=LayoutPosition::Absolute style="top: 64px;">
|
|
|
|
<LayoutSider>
|
|
|
|
<Menu value=selected>
|
2023-11-24 10:04:54 +08:00
|
|
|
|
|
|
|
{gen_guide_menu_data().into_view()}
|
|
|
|
|
2023-11-08 11:02:38 +08:00
|
|
|
</Menu>
|
|
|
|
</LayoutSider>
|
|
|
|
<Layout style="padding: 8px 12px 28px; overflow-y: auto;">
|
|
|
|
<Outlet/>
|
|
|
|
</Layout>
|
|
|
|
</Layout>
|
|
|
|
</Layout>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-08 17:27:01 +08:00
|
|
|
pub(crate) struct MenuGroupOption {
|
|
|
|
pub label: String,
|
|
|
|
pub children: Vec<MenuItemOption>,
|
2023-11-08 11:02:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl IntoView for MenuGroupOption {
|
|
|
|
fn into_view(self) -> View {
|
|
|
|
let Self { label, children } = self;
|
|
|
|
view! {
|
|
|
|
<MenuGroup label=label>
|
2023-11-24 10:04:54 +08:00
|
|
|
|
|
|
|
{children.into_iter().map(|v| v.into_view()).collect_view()}
|
|
|
|
|
2023-11-08 11:02:38 +08:00
|
|
|
</MenuGroup>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-08 17:27:01 +08:00
|
|
|
pub(crate) struct MenuItemOption {
|
|
|
|
pub label: String,
|
|
|
|
pub value: String,
|
2023-11-08 11:02:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl IntoView for MenuItemOption {
|
|
|
|
fn into_view(self) -> View {
|
|
|
|
let Self { label, value } = self;
|
2023-11-24 10:04:54 +08:00
|
|
|
view! { <MenuItem key=value label/> }
|
2023-11-08 11:02:38 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-08 17:27:01 +08:00
|
|
|
pub(crate) fn gen_guide_menu_data() -> Vec<MenuGroupOption> {
|
2023-11-08 11:02:38 +08:00
|
|
|
vec![MenuGroupOption {
|
|
|
|
label: "Getting Started".into(),
|
|
|
|
children: vec![
|
|
|
|
MenuItemOption {
|
|
|
|
value: "installation".into(),
|
|
|
|
label: "Installation".into(),
|
|
|
|
},
|
|
|
|
MenuItemOption {
|
|
|
|
value: "usage".into(),
|
|
|
|
label: "Usage".into(),
|
|
|
|
},
|
|
|
|
],
|
|
|
|
}]
|
|
|
|
}
|