From c42ee6ce8112e67a88a579239a15eceadd74ed78 Mon Sep 17 00:00:00 2001 From: spinline Date: Wed, 4 Feb 2026 19:14:20 +0300 Subject: [PATCH] fix(ui): refactor to native css focus dropdowns for ios support --- frontend/src/components/layout/statusbar.rs | 142 +++----------------- 1 file changed, 17 insertions(+), 125 deletions(-) diff --git a/frontend/src/components/layout/statusbar.rs b/frontend/src/components/layout/statusbar.rs index 04fe1e3..f455cc2 100644 --- a/frontend/src/components/layout/statusbar.rs +++ b/frontend/src/components/layout/statusbar.rs @@ -1,4 +1,5 @@ use leptos::*; +use wasm_bindgen::JsCast; use shared::GlobalLimitRequest; fn format_bytes(bytes: i64) -> String { @@ -25,104 +26,25 @@ fn format_speed(bytes_per_sec: i64) -> String { pub fn StatusBar() -> impl IntoView { let store = use_context::().expect("store not provided"); 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<(i64, &str)> = 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"), - (20 * 1024 * 1024, "20 MB/s"), - ]; - - let set_limit = move |limit_type: &str, val: i64| { - let limit_type = limit_type.to_string(); - logging::log!("Setting {} limit to {}", limit_type, val); - - 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); - - match client { - Ok(req) => match req.send().await { - Ok(resp) => { - if !resp.ok() { - logging::error!( - "Failed to set limit: {} {}", - resp.status(), - resp.status_text() - ); - } else { - logging::log!("Limit set successfully"); - } - } - Err(e) => logging::error!("Network error setting limit: {}", e), - }, - Err(e) => logging::error!("Failed to create request: {}", e), + // Helper to close dropdowns by blurring the active element + let close_dropdown = move || { + if let Some(doc) = web_sys::window().and_then(|w| w.document()) { + if let Some(active) = doc.active_element() { + let _ = active.dyn_into::().map(|el| el.blur()); } - }); - set_down_menu_open.set(false); - set_up_menu_open.set(false); + } }; - // Register global click/touch listener to close menus when clicking outside - let close_menus = move || { - if down_menu_open.get_untracked() { set_down_menu_open.set(false); } - if up_menu_open.get_untracked() { set_up_menu_open.set(false); } - if theme_open.get_untracked() { set_theme_open.set(false); } - }; - - // Use window_event_listener from leptos for both click and touchstart (for iOS) - let _ = window_event_listener(ev::click, { - let close = close_menus.clone(); - move |_| close() - }); - let _ = window_event_listener(ev::touchstart, move |_| close_menus()); - view! {
// --- DOWNLOAD SPEED DROPDOWN --- -
+