Skip to content

Commit f50b3c8

Browse files
committed
feat(Frontend): ✨ Close #97
1 parent 89a74ad commit f50b3c8

File tree

1 file changed

+107
-2
lines changed

1 file changed

+107
-2
lines changed

frontend/src/pages/home.rs

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,113 @@
1+
use chrono::{DateTime, Utc};
12
use leptos::*;
3+
use leptos_router::use_query_map;
24

3-
use crate::components::*;
5+
use crate::{
6+
components::*,
7+
utils::{grpc::list_announcement_request as la_req, *},
8+
};
9+
10+
async fn fetcher(
11+
paginator: Paginator<Result<la_req::Create>>,
12+
size: u64,
13+
token: Option<String>,
14+
) -> Result<(String, u64, Vec<grpc::AnnouncementInfo>)> {
15+
let request = match paginator {
16+
Paginator::Create(offset, create) => grpc::ListAnnouncementRequest {
17+
size,
18+
offset,
19+
request: Some(la_req::Request::Create(create?)),
20+
},
21+
Paginator::Paginate(offset, paginator) => {
22+
grpc::ListAnnouncementRequest {
23+
size,
24+
offset,
25+
request: Some(la_req::Request::Paginator(paginator)),
26+
}
27+
}
28+
};
29+
let mut client =
30+
grpc::announcement_client::AnnouncementClient::new(grpc::new_client());
31+
let list = client
32+
.list(request.with_optional_token(token))
33+
.await?
34+
.into_inner();
35+
Result::<_>::Ok((list.paginator, list.remain, list.list))
36+
}
437

538
#[component]
639
pub fn Home() -> impl IntoView {
7-
view! { <Unimplemented /> }
40+
let mut submit_query = create_paginate_query(fetcher, Default::default());
41+
42+
let query_map = use_query_map();
43+
let page = create_params_map_key("p", 0u32);
44+
let order = create_params_map_key("o", GrpcEnum(grpc::Order::Ascend));
45+
46+
let info = Signal::derive(move || {
47+
query_map.with(|map| {
48+
Ok(la_req::Create {
49+
order: map.get_key_with_default(order).into(),
50+
query: Some(la_req::Query {
51+
sort_by: None,
52+
text: None,
53+
contest_id: None,
54+
}),
55+
})
56+
})
57+
});
58+
59+
let page_value = query_map.use_key_with_default(page);
60+
61+
let headers = [
62+
(None, "Id".into_view()),
63+
(None, "Announcement Title".into_view()),
64+
(Some(()), "When".into_view()),
65+
];
66+
67+
let query_result = submit_query.query(move || (page_value(), info()));
68+
let table = move || {
69+
query_result
70+
.data
71+
.get()
72+
.map(|v| {
73+
v.map(|v| {
74+
v.into_iter()
75+
.map(|info| {
76+
let when: DateTime<Utc> = info.update_date.into();
77+
(
78+
format!("/announcement/{}", info.id),
79+
[
80+
format!("{:04}", info.id).into_view(),
81+
info.title.into_view(),
82+
when.format("%Y/%m/%d %H:%M:%S")
83+
.to_string()
84+
.into_view(),
85+
],
86+
)
87+
})
88+
.collect::<Vec<_>>()
89+
})
90+
})
91+
.map(|rows| {
92+
view! {
93+
<PaginateTableWithoutSort
94+
class="grid-cols-[max-content_1fr_max-content_max-content] w-full"
95+
headers=headers.clone()
96+
rows
97+
order
98+
/>
99+
}
100+
})
101+
};
102+
103+
let max_page = query_result.max_page;
104+
105+
view! {
106+
<div class="container grow flex flex-col items-center justify-between gap-4 py-10">
107+
<Transition fallback=|| view! { "loading" }>
108+
<ErrorFallback clone:table>{table}</ErrorFallback>
109+
</Transition>
110+
<PaginateNavbar size=4 page max_page />
111+
</div>
112+
}
8113
}

0 commit comments

Comments
 (0)