Show user by ID implemented

At /users/{id},
Also minor bugfixes and improvements
This commit is contained in:
2026-04-29 20:54:14 +02:00
parent 6dfa21a005
commit 63af32c4af
3 changed files with 79 additions and 4 deletions

View File

@@ -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! { <user::Register/> },
Route::Login => html! { <user::Login/> },
Route::AllUsers => html! {<user::AllUsers/>},
Route::UserByID { id } => html! { <user::UserByID id={id}/> },
}
}

View File

@@ -36,7 +36,7 @@ pub struct TicketProps {
}
#[derive(Deserialize, Debug)]
pub struct ApiError {
struct ApiError {
message: String,
_status: String,
}

View File

@@ -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::<FilteredUser>);
let error = use_state(|| None::<String>);
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::<FilteredUser>().await {
Ok(u) => user.set(Some(u)),
Err(err) => error.set(Some(format!("Parse error: {}", err))),
}
} else {
match response.json::<ApiError>().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! {<p>{ "Loading" }</p>}
} else if let Some(e) = &*error {
html! { <p>{ format!("Error: {}", e) }</p> }
} else if let Some(u) = &*user {
html! {
<div>
<h1>{ format!("User #{}", u.id) }</h1>
<p><strong>{ "Vorname: " }</strong>{ &u.first_name }</p>
<p><strong>{ "Nachname: " }</strong>{ &u.last_name }</p>
<p><strong>{ "Benutzername: " }</strong>{ &u.username }</p>
<p><strong>{ "Ist Admin: " }</strong>{ u.is_admin }</p>
</div>
}
} else {
html! { <p>{ "No ticket found." }</p> }
}
}