diff --git a/frontend/src/components/layout/statusbar.rs b/frontend/src/components/layout/statusbar.rs index 687a96e..3fa1cef 100644 --- a/frontend/src/components/layout/statusbar.rs +++ b/frontend/src/components/layout/statusbar.rs @@ -1,4 +1,5 @@ use leptos::*; +use shared::GlobalLimitRequest; fn format_bytes(bytes: i64) -> String { const UNITS: [&str; 6] = ["B", "KB", "MB", "GB", "TB", "PB"]; @@ -26,37 +27,147 @@ pub fn StatusBar() -> impl IntoView { let stats = store.global_stats; let (theme_open, set_theme_open) = create_signal(false); + // Dropdown states + let (down_menu_open, set_down_menu_open) = create_signal(false); + let (up_menu_open, set_up_menu_open) = create_signal(false); + + // Preset limits in bytes/s + let limits = vec![ + (0, "Unlimited"), + (100 * 1024, "100 KB/s"), + (500 * 1024, "500 KB/s"), + (1024 * 1024, "1 MB/s"), + (2 * 1024 * 1024, "2 MB/s"), + (5 * 1024 * 1024, "5 MB/s"), + (10 * 1024 * 1024, "10 MB/s"), + ]; + + let set_limit = move |limit_type: &str, val: i64| { + let limit_type = limit_type.to_string(); + spawn_local(async move { + let req_body = if limit_type == "down" { + GlobalLimitRequest { + max_download_rate: Some(val), + max_upload_rate: None, + } + } else { + GlobalLimitRequest { + max_download_rate: None, + max_upload_rate: Some(val), + } + }; + + let client = + gloo_net::http::Request::post("/api/settings/global-limits").json(&req_body); + + if let Ok(req) = client { + if let Err(e) = req.send().await { + logging::error!("Failed to set limit: {}", e); + } + } + }); + set_down_menu_open.set(false); + set_up_menu_open.set(false); + }; + view! {