use crate::components::{Button, Page, Table, TextInput}; use lan_party_core::user::User; use wasm_bindgen_futures::spawn_local; use yew::prelude::*; #[derive(Debug, Default)] pub struct UsersPage { headers: Vec, users: Vec, score_edit: Option, current_score: String, } pub enum Msg { UpdateList(Vec), UpdateScoreInput(String), UpdateScore(usize), EditScore(usize), DeleteUser(usize), } impl Component for UsersPage { type Message = Msg; type Properties = (); fn create(ctx: &Context) -> Self { Self { headers: vec!["Username".into(), "Score".into(), "".into()], ..Default::default() } } fn rendered(&mut self, ctx: &Context, first_render: bool) { let link = ctx.link().clone(); if first_render { spawn_local(async move { let res: Result, _> = crate::util::api_request("GET", "/user", Option::<()>::None).await; link.send_message(Msg::UpdateList(res.unwrap())) }); } } fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { match msg { Msg::UpdateList(list) => { self.users = list; true } Msg::UpdateScoreInput(value) => { self.current_score = value; true } Msg::EditScore(i) => { self.current_score = self.users[i].score.to_string(); self.score_edit = Some(i); true } Msg::UpdateScore(i) => { self.score_edit = None; true } Msg::DeleteUser(i) => true, _ => todo!(), } } fn view(&self, ctx: &Context) -> Html { let link = ctx.link().clone(); html! { {self.users.iter().enumerate().map(|(i, user)| html! { }).collect::()}
{&user.name} {if Some(i) == self.score_edit { html! { <>
} } }