diff --git a/frontend/src/lib.rs b/frontend/src/lib.rs index 8b604c6..076f4b5 100644 --- a/frontend/src/lib.rs +++ b/frontend/src/lib.rs @@ -19,6 +19,8 @@ enum Route { Login, #[at("/users")] AllUsers, + #[at("/users/:id")] + UserByID { id: i16 }, #[not_found] #[at("/404")] NotFound, @@ -34,6 +36,7 @@ fn switch(route: Route) -> Html { Route::Register => html! { }, Route::Login => html! { }, Route::AllUsers => html! {}, + Route::UserByID { id } => html! { }, } } diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs index 4708c8e..401670a 100644 --- a/frontend/src/pages/ticket.rs +++ b/frontend/src/pages/ticket.rs @@ -36,7 +36,7 @@ pub struct TicketProps { } #[derive(Deserialize, Debug)] -pub struct ApiError { +struct ApiError { message: String, _status: String, } diff --git a/frontend/src/pages/user.rs b/frontend/src/pages/user.rs index 5d1ca48..d3da76c 100644 --- a/frontend/src/pages/user.rs +++ b/frontend/src/pages/user.rs @@ -40,7 +40,13 @@ pub struct FilteredUser { #[derive(Properties, PartialEq)] pub struct UserProps { - id: i16, + pub id: i16, +} + +#[derive(Deserialize, Debug)] +struct ApiError { + message: String, + _status: String, } #[component(Register)] @@ -285,5 +291,71 @@ pub fn all_users_component() -> Html { } } -//#[component(UserByID)] -//pub fn user_by_id_component() +#[component(UserByID)] +pub fn user_by_id_component(props: &UserProps) -> Html { + let user = use_state(|| None::); + let error = use_state(|| None::); + let loading = use_state(|| false); + let id = props.id; + let status = use_state(|| "".to_string()); + + { + let user = user.clone(); + let error = error.clone(); + let loading = loading.clone(); + + use_effect_with(id, move |id_ref| { + loading.set(true); + let user = user.clone(); + let error = error.clone(); + let id = *id_ref; + spawn_local(async move { + let url = format!("/api/users/{}", id); + + match Request::get(&url).send().await { + Ok(response) => { + let status = response.status(); + if status == 200 { + match response.json::().await { + Ok(u) => user.set(Some(u)), + Err(err) => error.set(Some(format!("Parse error: {}", err))), + } + } else { + match response.json::().await { + Ok(ae) => error.set(Some(ae.message)), + Err(_) => { + if let Ok(text) = response.text().await { + error.set(Some(text)); + } else { + error.set(Some(format!("Server error: {}", status))); + } + } + } + } + } + Err(err) => error.set(Some(format!("Network error: {}", err))), + } + loading.set(false); + }); + || () + }); + } + + if *loading { + html! {

{ "Loading" }

} + } else if let Some(e) = &*error { + html! {

{ format!("Error: {}", e) }

} + } else if let Some(u) = &*user { + html! { +
+

{ format!("User #{}", u.id) }

+

{ "Vorname: " }{ &u.first_name }

+

{ "Nachname: " }{ &u.last_name }

+

{ "Benutzername: " }{ &u.username }

+

{ "Ist Admin: " }{ u.is_admin }

+
+ } + } else { + html! {

{ "No ticket found." }

} + } +}