diff --git a/frontend/src/components/paginate_navbar.rs b/frontend/src/components/paginate_navbar.rs index 7e670be..a36334a 100644 --- a/frontend/src/components/paginate_navbar.rs +++ b/frontend/src/components/paginate_navbar.rs @@ -70,8 +70,7 @@ fn PaginateNavbarButton( #[prop(into)] page: ParamsMapKey, ) -> impl IntoView { let query_map = use_query_map(); - let href = - query_map.with_key_map(move |map| map.set_key(page, Some(i()))); + let href = query_map.with_key_map(move |map| map.set_key(page, Some(i()))); let page = query_map.use_key_with_default(page); let disabled = create_memo(move |_| page() == i()); view! { diff --git a/frontend/src/components/paginate_table.rs b/frontend/src/components/paginate_table.rs index a593065..8532933 100644 --- a/frontend/src/components/paginate_table.rs +++ b/frontend/src/components/paginate_table.rs @@ -25,8 +25,7 @@ where }; let mut query_map = query_map.get_untracked(); if s == query_map.get_key_with_default(sort) { - let toggle_order = match query_map.get_key_with_default(order) - { + let toggle_order = match query_map.get_key_with_default(order) { grpc::Order::Ascend => grpc::Order::Descend, grpc::Order::Descend => grpc::Order::Ascend, }; diff --git a/frontend/src/components/toast.rs b/frontend/src/components/toast.rs index 8707c93..3ac3ca5 100644 --- a/frontend/src/components/toast.rs +++ b/frontend/src/components/toast.rs @@ -104,10 +104,7 @@ fn Toast( stop, is_pending, .. - } = { - let close = close; - use_timeout_fn(move |_| close(), 4.0 * 1000.0) - }; + } = { use_timeout_fn(move |_| close(), 4.0 * 1000.0) }; let node_ref = create_node_ref::(); let hover = use_element_hover(node_ref); diff --git a/frontend/src/pages/mod.rs b/frontend/src/pages/mod.rs index 432ded9..2e6ec14 100644 --- a/frontend/src/pages/mod.rs +++ b/frontend/src/pages/mod.rs @@ -1,12 +1,96 @@ mod about; +mod contest; mod contests; mod create; mod home; mod login; -mod pages; mod problem; mod problems; mod rank; mod submission; -mod contest; -pub use pages::*; + +use about::About; +use contest::Contest; +use contests::Contests; +use home::Home; +use leptos::*; +use leptos_router::*; +use leptos_use::*; +use login::Login; +use problem::ProblemRouter; +use problems::Problems; +use rank::Rank; +use submission::Submission; + +use crate::{components::*, utils::*}; + +/// |Permission|Root|Admin|SuperUser|User|Guest +/// |:-|:-:|:-:|:-:|:-:|:-:| +/// |Register User|/|/|/|/|/| +/// |Join *any* Contest|V|||| +/// |Create Admin|V|||| +/// |Create SuperUser|V|V||| +/// |Create User|V|V||| +/// |Create Announcement for Contest|V|V||| +/// |Create/Publish Announcement|V|V||| +/// |Create/Publish Problem|V|V|V|| +/// |Create/Publish Contest|V|V|V|| +/// |Submit Problem|V|V|V|V| +/// > `/` 代表看 backend config +#[component] +pub fn Pages() -> impl IntoView { + let token = use_token(); + let role = use_role(); + let can_create_problem_or_contest = move || { + role().is_some_and(|role| match role { + grpc::Role::User => false, + grpc::Role::Super | grpc::Role::Admin | grpc::Role::Root => true, + }) + }; + + let show_footer = move || { + !use_location() + .pathname + .with(|path| path.starts_with("/problem/")) + }; + let page_wrapper = move || { + view! { + + + +