use leptos::*;
#[leptos::component]
pub fn scoreboard() -> impl leptos::IntoView {
use leptos::Suspense;
let scoreboard_resource =
create_resource(leptos_router::use_params_map(), |params| async move {
let id = params.get("id").unwrap();
let res =
reqwasm::http::Request::get(&format!("/api/demos/{}/analysis/scoreboard", id))
.send()
.await
.unwrap();
res.json::()
.await
.unwrap()
});
view! {
Scoreboard
Loading Scoreboard data
}
>
}
}
fn damage_sorting(p1: &common::demo_analysis::ScoreBoardPlayer, p2: &common::demo_analysis::ScoreBoardPlayer) -> core::cmp::Ordering {
p2.damage.cmp(&p1.damage)
}
fn kill_sorting(p1: &common::demo_analysis::ScoreBoardPlayer, p2: &common::demo_analysis::ScoreBoardPlayer) -> core::cmp::Ordering {
p2.kills.cmp(&p1.kills)
}
fn assists_sorting(p1: &common::demo_analysis::ScoreBoardPlayer, p2: &common::demo_analysis::ScoreBoardPlayer) -> core::cmp::Ordering {
p2.assists.cmp(&p1.assists)
}
fn deaths_sorting(p1: &common::demo_analysis::ScoreBoardPlayer, p2: &common::demo_analysis::ScoreBoardPlayer) -> core::cmp::Ordering {
p2.deaths.cmp(&p1.deaths)
}
#[leptos::component]
fn team_scoreboard(info: Resource, team_name: String, part: fn(common::demo_analysis::ScoreBoard) -> Vec) -> impl IntoView {
let (ordering, set_ordering) = create_signal:: core::cmp::Ordering>(damage_sorting);
let style = stylers::style! {
"Team-Scoreboard",
tr:nth-child(even) {
background-color: #dddddd;
}
th {
padding-left: 10px;
padding-right: 10px;
}
th:nth-child(1) {
width: 200px;
}
};
view! {
class = style,
{ team_name }
| Name |
Kills |
Assists |
Deaths |
Damage |
{
move || {
let value = info.get().map(|v| part(v));
let mut players: Vec<_> = value.into_iter().flat_map(|v| v).collect();
let sorting = ordering.get();
players.sort_unstable_by(|p1, p2| sorting(p1, p2));
players.into_iter().map(|s| {
view! {
class=style,
| { s.name } | { s.kills } | { s.assists } | { s.deaths } | { s.damage } |
}
}).collect::>()
}
}
}
}