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

127 lines
3.2 KiB
Rust

mod components;
mod pages;
pub mod state;
pub mod util;
use components::messages::{Messages, Messenger};
use pages::{EventsPage, UsersPage};
use state::{Events, Users};
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| {
let messenger = Messenger::default();
provide_context(cx, messenger);
let users = Users::default();
provide_context(cx, users);
let events = Events::default();
provide_context(cx, events);
/*
let messages = use_context::<MessagesState>(cx);
spawn_local_scoped(cx, async move {
TimeoutFuture::new(1000).await;
messages.add_message(Message::new(
"Hello there".into(),
"This is a message".into(),
));
TimeoutFuture::new(1000).await;
messages.add_message(Message::new("Oh look!".into(), "Another message".into()));
});
*/
view! { cx,
Router(
integration=HistoryIntegration::new(),
view=|cx, route: &ReadSignal<AppRoutes>| {
view! { cx,
Messages()
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"
},
})
}
}
}
)
}
});
}