lan-party-backend/web/src/main.rs

97 lines
2.4 KiB
Rust

mod components;
mod pages;
pub mod util;
use pages::{EventsPage, UsersPage};
use sycamore::prelude::*;
use sycamore_router::{HistoryIntegration, Route, Router};
#[derive(Route)]
enum AppRoutes {
#[to("/")]
Home,
#[to("/users")]
Users,
#[to("/events")]
Events,
#[not_found]
NotFound,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Page {
name: String,
target: String,
}
#[derive(Prop)]
pub struct NavbarProps<'a, G: Html> {
children: Children<'a, G>,
pages: Vec<Page>,
}
#[component]
pub fn Navbar<'a, G: Html>(cx: Scope<'a>, props: NavbarProps<'a, G>) -> View<G> {
let children = props.children.call(cx);
view! { cx,
nav {
(View::new_fragment(props.pages.iter().cloned().enumerate().map(|(_i, page)| {
view! { cx, a(href=page.target) { (page.name) } }
}).collect()))
(children)
}
}
}
fn main() {
console_log::init_with_level(log::Level::Debug).unwrap();
let pages = vec![
Page {
target: "/".into(),
name: "Home".into(),
},
Page {
target: "/users".into(),
name: "Users".into(),
},
Page {
target: "/events".into(),
name: "Events".into(),
},
];
sycamore::render(move |cx| {
view! { cx,
Router(
integration=HistoryIntegration::new(),
view=|cx, route: &ReadSignal<AppRoutes>| {
view! { cx,
header {
Navbar(pages=pages) {
}
}
main {
(match route.get().as_ref() {
AppRoutes::Home => view! { cx,
"This is the home page"
},
AppRoutes::Users => view! { cx,
UsersPage
},
AppRoutes::Events => view! { cx,
EventsPage
},
AppRoutes::NotFound => view! { cx,
"404 Not Found"
},
})
}
}
}
)
}
});
}