diff --git a/frontend/src/lib.rs b/frontend/src/lib.rs index feeeee3..83c6a12 100644 --- a/frontend/src/lib.rs +++ b/frontend/src/lib.rs @@ -11,6 +11,8 @@ enum Route { Ticket, #[at("/tickets/:id")] TicketById { id: i32 }, + #[at("/tickets")] + AllTickets, #[not_found] #[at("/404")] NotFound, @@ -22,6 +24,7 @@ fn switch(route: Route) -> Html { Route::NotFound => html! { }, Route::Ticket => html! { }, Route::TicketById { id } => html! { }, + Route::AllTickets => html! { }, } } diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs index 0a98672..45d98f7 100644 --- a/frontend/src/pages/ticket.rs +++ b/frontend/src/pages/ticket.rs @@ -211,3 +211,58 @@ pub fn show_ticket_by_id_component(props: &TicketProps) -> Html { html! {

{ "No ticket found." }

} } } + +#[component(AllTickets)] +pub fn all_tickets_component() -> Html { + let tickets = use_state(|| Vec::::new()); + let error = use_state(|| None::); + let loading = use_state(|| false); + + { + let tickets = tickets.clone(); + let error = error.clone(); + let loading = loading.clone(); + + use_effect_with((), move |_| { + loading.set(true); + spawn_local(async move { + let url = format!("http://localhost:8001/api/tickets"); + match Request::get(&url).send().await { + Ok(response) if response.status() == 200 => { + match response.json::>().await { + Ok(t) => tickets.set(t), + Err(e) => error.set(Some(format!("parse error: {}", e))), + } + } + Ok(response) => { + if let Ok(text) = response.text().await { + error.set(Some(text)); + } else { + error.set(Some(format!("status {}", response.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 { + html! { +
    + { for tickets.iter().map(|t| html! { +
  • +

    { format!("{} - #{}", t.betreff, t.id) }

    +

    { &t.description }

    +
  • + })} +
+ } + } +}