use web_sys::HtmlInputElement; use yew::prelude::*; use crate::api; use crate::components::status_badge::StatusBadge; use crate::types::DownloadItem; #[function_component(DownloadsPage)] pub fn downloads_page() -> Html { let items = use_state(|| None::>); let error = use_state(|| None::); let message = use_state(|| None::); let dl_query = use_state(String::new); let refresh = { let items = items.clone(); let error = error.clone(); Callback::from(move |_: ()| { let items = items.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { match api::get_downloads(None).await { Ok(d) => items.set(Some(d)), Err(e) => error.set(Some(e.0)), } }); }) }; { let refresh = refresh.clone(); use_effect_with((), move |_| { refresh.emit(()); }); } let on_sync = { let message = message.clone(); let error = error.clone(); let refresh = refresh.clone(); Callback::from(move |_: MouseEvent| { let message = message.clone(); let error = error.clone(); let refresh = refresh.clone(); wasm_bindgen_futures::spawn_local(async move { match api::sync_downloads().await { Ok(s) => { message.set(Some(format!( "Synced: {} found, {} enqueued, {} skipped", s.found, s.enqueued, s.skipped ))); refresh.emit(()); } Err(e) => error.set(Some(e.0)), } }); }) }; let on_process = { let message = message.clone(); let error = error.clone(); Callback::from(move |_: MouseEvent| { let message = message.clone(); let error = error.clone(); wasm_bindgen_futures::spawn_local(async move { match api::process_downloads().await { Ok(t) => message.set(Some(format!("Processing started (task: {})", t.task_id))), Err(e) => error.set(Some(e.0)), } }); }) }; let on_manual_dl = { let dl_query = dl_query.clone(); let message = message.clone(); let error = error.clone(); let refresh = refresh.clone(); Callback::from(move |e: SubmitEvent| { e.prevent_default(); let q = (*dl_query).clone(); let message = message.clone(); let error = error.clone(); let refresh = refresh.clone(); wasm_bindgen_futures::spawn_local(async move { match api::enqueue_download(&q).await { Ok(item) => { message.set(Some(format!("Enqueued: {}", item.query))); refresh.emit(()); } Err(e) => error.set(Some(e.0)), } }); }) }; html! {
if let Some(ref msg) = *message {
{ msg }
} if let Some(ref err) = *error {
{ err }
} { match &*items { None => html! {

{ "Loading..." }

}, Some(items) if items.is_empty() => html! {

{ "Queue is empty." }

}, Some(items) => html! { { for items.iter().map(|item| { let id = item.id; let refresh = refresh.clone(); html! { } })}
{ "ID" }{ "Query" }{ "Status" }{ "Retries" }{ "Error" }
{ item.id } { &item.query } { item.retry_count } { item.error_message.as_deref().unwrap_or("") } if item.status == "Failed" { } if item.status == "Pending" { }
}, }}
} }