use leptos::prelude::*; use leptos_router::{components::A, hooks::use_params_map}; use crate::api::{self, GameSummary, UserProfile}; use crate::i18n::*; #[component] pub fn ProfilePage() -> impl IntoView { let params = use_params_map(); let username = move || params.read().get("username").unwrap_or_default(); let profile = LocalResource::new(move || { let u = username(); async move { api::get_user_profile(&u).await } }); let i18n = use_i18n(); view! {
{move || match profile.get().map(|sw| sw.take()) { None => view! {

{t!(i18n, loading)}

}.into_any(), Some(Err(e)) => view! {

{ e }

}.into_any(), Some(Ok(p)) => view! { }.into_any(), }}
} } #[component] fn ProfileContent(profile: UserProfile, username: String) -> impl IntoView { let i18n = use_i18n(); let page = RwSignal::new(0i64); let games = LocalResource::new(move || { let u = username.clone(); let p = page.get(); async move { api::get_user_games(&u, p).await } }); let joined = api::format_ts(profile.created_at); view! {

{ profile.username.clone() }

{t!(i18n, member_since)} " " { joined }

{ profile.total_games }
{t!(i18n, stat_games)}
{ profile.wins }
{t!(i18n, stat_wins)}
{ profile.losses }
{t!(i18n, stat_losses)}
{ profile.draws }
{t!(i18n, stat_draws)}

{t!(i18n, game_history_title)}

{move || match games.get().map(|sw| sw.take()) { None => view! {

{t!(i18n, loading)}

}.into_any(), Some(Err(e)) => view! {

{ e }

}.into_any(), Some(Ok(r)) => { if r.games.is_empty() { view! {

{t!(i18n, no_games)}

}.into_any() } else { view! { }.into_any() } } }}
} } #[component] fn GamesTable(games: Vec, page: RwSignal) -> impl IntoView { let i18n = use_i18n(); let rows = games.clone(); let has_next = games.len() == 20; view! { {rows.into_iter().map(|g| { let started = api::format_ts(g.started_at); let ended = g.ended_at.map(api::format_ts).unwrap_or_else(|| "—".into()); let outcome_class = match g.outcome.as_deref() { Some("win") => "outcome-win", Some("loss") => "outcome-loss", Some("draw") => "outcome-draw", _ => "", }; let outcome_text = move || match g.outcome.as_deref() { Some("win") => t_string!(i18n, outcome_win), Some("loss") => t_string!(i18n, outcome_loss), Some("draw") => t_string!(i18n, outcome_draw), _ => "—", }; view! { } }).collect_view()}
{t!(i18n, col_room)} {t!(i18n, col_started)} {t!(i18n, col_ended)} {t!(i18n, col_outcome)} {t!(i18n, col_detail)}
{ g.room_code.clone() } { started } { ended } { outcome_text } {t!(i18n, view_link)}
{move || if page.get() > 0 { view! { }.into_any() } else { view! { }.into_any() }} {t!(i18n, page_label)} " " { move || page.get() + 1 } {if has_next { view! { }.into_any() } else { view! { }.into_any() }}
} }