diff --git a/frontend/src/components/ui/context_menu.rs b/frontend/src/components/ui/context_menu.rs index f293047..f303c17 100644 --- a/frontend/src/components/ui/context_menu.rs +++ b/frontend/src/components/ui/context_menu.rs @@ -86,37 +86,23 @@ pub fn ContextMenuHoldAction( #[prop(default = 1000)] hold_duration: u64, ) -> impl IntoView { let is_holding = RwSignal::new(false); - let progress = RwSignal::new(0.0); let on_mousedown = move |_| { is_holding.set(true); - progress.set(0.0); }; let on_mouseup = move |_| { is_holding.set(false); - progress.set(0.0); }; Effect::new(move |_| { if is_holding.get() { - let start_time = js_sys::Date::now(); - let duration = hold_duration as f64; - leptos::task::spawn_local(async move { - while is_holding.get_untracked() { - let now = js_sys::Date::now(); - let elapsed = now - start_time; - let p = (elapsed / duration).min(1.0); - progress.set(p * 100.0); - - if p >= 1.0 { - on_hold_complete.run(()); - is_holding.set(false); - close_context_menu(); - break; - } - gloo_timers::future::TimeoutFuture::new(16).await; // ~60fps + gloo_timers::future::TimeoutFuture::new(hold_duration as u32).await; + if is_holding.get_untracked() { + on_hold_complete.run(()); + is_holding.set(false); + close_context_menu(); } }); } @@ -128,8 +114,18 @@ pub fn ContextMenuHoldAction( ); view! { +