()
| 293 | #[tracing::instrument(level = "debug", skip())] |
| 294 | #[component] |
| 295 | pub fn ExtraControls() -> impl IntoView { |
| 296 | let player_store = use_context::<RwSignal<PlayerStore>>().unwrap(); |
| 297 | let (current_volume, set_current_volume) = create_slice( |
| 298 | player_store, |
| 299 | |player_store| player_store.get_raw_volume(), |
| 300 | |player_store, volume| player_store.set_volume(volume), |
| 301 | ); |
| 302 | |
| 303 | let is_cut = Memo::new(move |_| current_volume.get() == 0f64); |
| 304 | let ui_store = expect_context::<RwSignal<UiStore>>(); |
| 305 | |
| 306 | let toggle_mute_sig = create_write_slice(player_store, |p, _| { |
| 307 | p.toggle_mute(); |
| 308 | }); |
| 309 | |
| 310 | let toggle_mute = move |_| { |
| 311 | toggle_mute_sig.set(()); |
| 312 | }; |
| 313 | |
| 314 | let show_popup_volume = RwSignal::new(false); |
| 315 | let interval = RwSignal::<Option<TimeoutHandle>>::new(None); |
| 316 | |
| 317 | view! { |
| 318 | <div class="row no-gutters align-items-center justify-content-end"> |
| 319 | <div |
| 320 | class="col-auto volume-slider-container d-flex" |
| 321 | class:volume-slider-show=move || show_popup_volume.get() |
| 322 | on:mouseover=move |_| { |
| 323 | if show_popup_volume.get_untracked() { |
| 324 | interval |
| 325 | .update(|i| { |
| 326 | if let Some(i) = i.take() { |
| 327 | i.clear(); |
| 328 | } |
| 329 | }); |
| 330 | } |
| 331 | } |
| 332 | on:mouseout=move |_| { |
| 333 | interval |
| 334 | .update(|i| { |
| 335 | if let Some(i) = i.take() { |
| 336 | i.clear(); |
| 337 | } |
| 338 | *i = Some( |
| 339 | set_timeout_with_handle( |
| 340 | move || { |
| 341 | show_popup_volume.set(false); |
| 342 | }, |
| 343 | Duration::from_millis(800), |
| 344 | ) |
| 345 | .unwrap(), |
| 346 | ); |
| 347 | }); |
| 348 | } |
| 349 | > |
| 350 | <input |
| 351 | type="range" |
| 352 | min="0" |
nothing calls this directly
no test coverage detected