Skip to content

Commit baba63a

Browse files
authored
Merge pull request #285 from DrFlowerkick/fix_media_stream_hooks
Fix media stream hooks
2 parents 085eac7 + e7a47a2 commit baba63a

File tree

6 files changed

+29
-21
lines changed

6 files changed

+29
-21
lines changed

examples/signal_debounced/src/main.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use leptos::prelude::*;
22
use leptos_use::docs::{demo_or_body, Note};
33
use leptos_use::signal_debounced;
4-
use std::cell::RefCell;
54

65
#[component]
76
fn Demo() -> impl IntoView {

examples/use_active_element/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn Demo() -> impl IntoView {
2323
<Note class="mb-3">"Select the inputs below to see the changes"</Note>
2424

2525
<div class="grid grid-cols-1 md:grid-cols-3 gap-2">
26-
<For each=move || (1..7) key=|i| *i let:i>
26+
<For each=move || 1..7 key=|i| *i let:i>
2727
<input type="text" data-id=i class="!my-0 !min-w-0" placeholder=i/>
2828
</For>
2929

examples/use_intersection_observer/src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use leptos::html::Div;
22
use leptos::prelude::*;
3-
use leptos_use::docs::{BooleanDisplay, demo_or_body};
3+
use leptos_use::docs::{demo_or_body, BooleanDisplay};
44
use leptos_use::{
5-
UseIntersectionObserverOptions, UseIntersectionObserverReturn,
6-
use_intersection_observer_with_options,
5+
use_intersection_observer_with_options, UseIntersectionObserverOptions,
6+
UseIntersectionObserverReturn,
77
};
88

99
#[component]

examples/use_storage/src/main.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ impl Default for BananaState {
2727
fn Demo() -> impl IntoView {
2828
let (storage_key, set_storage_key) = signal("banana-state".to_string());
2929

30-
let (state, set_state, reset) =
31-
use_local_storage::<BananaState, JsonSerdeCodec>(storage_key);
30+
let (state, set_state, reset) = use_local_storage::<BananaState, JsonSerdeCodec>(storage_key);
3231
let (state2, _, _) = use_local_storage::<BananaState, JsonSerdeCodec>(storage_key);
3332

3433
view! {
@@ -40,7 +39,7 @@ fn Demo() -> impl IntoView {
4039
on:input=move |e| set_storage_key.update(|s| *s = event_target_value(&e))
4140
type="text"
4241
/>
43-
42+
4443
<input
4544
class="block"
4645
prop:value=move || state.get().name

src/use_display_media.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
use crate::core::MaybeRwSignal;
2-
use crate::sendwrap_fn;
1+
use crate::{
2+
core::{MaybeRwSignal, OptionLocalSignal},
3+
sendwrap_fn,
4+
};
35
use cfg_if::cfg_if;
46
use default_struct_builder::DefaultBuilder;
57
use leptos::prelude::*;
68
use leptos::reactive::wrappers::read::Signal;
9+
use send_wrapper::SendWrapper;
710
use wasm_bindgen::{JsCast, JsValue};
811

912
/// Reactive [`mediaDevices.getDisplayMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia) streaming.
@@ -65,7 +68,7 @@ pub fn use_display_media_with_options(
6568

6669
let (enabled, set_enabled) = enabled.into_signal();
6770

68-
let (stream, set_stream) = signal_local(None::<Result<web_sys::MediaStream, JsValue>>);
71+
let (stream, set_stream) = signal(None::<SendWrapper<Result<web_sys::MediaStream, JsValue>>>);
6972

7073
let _start = move || async move {
7174
cfg_if! { if #[cfg(not(feature = "ssr"))] {
@@ -75,14 +78,16 @@ pub fn use_display_media_with_options(
7578

7679
let stream = create_media(audio).await;
7780

78-
set_stream.update(|s| *s = Some(stream));
81+
set_stream.update(|s| *s = Some(SendWrapper::new(stream)));
7982
} else {
8083
let _ = audio;
8184
}}
8285
};
8386

8487
let _stop = move || {
85-
if let Some(Ok(stream)) = stream.get_untracked() {
88+
if let Some(sendwrapped_stream) = stream.get_untracked()
89+
&& let Ok(stream) = sendwrapped_stream.as_ref()
90+
{
8691
for track in stream.get_tracks() {
8792
track.unchecked_ref::<web_sys::MediaStreamTrack>().stop();
8893
}
@@ -96,7 +101,7 @@ pub fn use_display_media_with_options(
96101
leptos::task::spawn_local(async move {
97102
_start().await;
98103
stream.with_untracked(move |stream| {
99-
if let Some(Ok(_)) = stream {
104+
if let Some(sendwrapped_stream) = stream && sendwrapped_stream.as_ref().is_ok() {
100105
set_enabled.set(true);
101106
}
102107
});
@@ -186,7 +191,7 @@ where
186191
/// Initially this is `None` until `start` resolved successfully.
187192
/// In case the stream couldn't be started, for example because the user didn't grant permission,
188193
/// this has the value `Some(Err(...))`.
189-
pub stream: Signal<Option<Result<web_sys::MediaStream, JsValue>>, LocalStorage>,
194+
pub stream: OptionLocalSignal<Result<web_sys::MediaStream, JsValue>>,
190195

191196
/// Starts the screen streaming. Triggers the ask for permission if not already granted.
192197
pub start: StartFn,

src/use_user_media.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
use crate::core::MaybeRwSignal;
1+
use crate::core::{MaybeRwSignal, OptionLocalSignal};
22
use default_struct_builder::DefaultBuilder;
33
use js_sys::{Object, Reflect};
44
use leptos::prelude::*;
5+
use send_wrapper::SendWrapper;
56
use wasm_bindgen::{JsCast, JsValue};
67

78
/// Reactive [`mediaDevices.getUserMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) streaming.
@@ -63,7 +64,7 @@ pub fn use_user_media_with_options(
6364

6465
let (enabled, set_enabled) = enabled.into_signal();
6566

66-
let (stream, set_stream) = signal_local(None::<Result<web_sys::MediaStream, JsValue>>);
67+
let (stream, set_stream) = signal(None::<SendWrapper<Result<web_sys::MediaStream, JsValue>>>);
6768

6869
let _start = {
6970
let audio = audio.clone();
@@ -78,7 +79,7 @@ pub fn use_user_media_with_options(
7879

7980
let stream = create_media(Some(video), Some(audio)).await;
8081

81-
set_stream.update(|s| *s = Some(stream));
82+
set_stream.update(|s| *s = Some(SendWrapper::new(stream)));
8283
}
8384

8485
#[cfg(feature = "ssr")]
@@ -90,7 +91,9 @@ pub fn use_user_media_with_options(
9091
};
9192

9293
let _stop = move || {
93-
if let Some(Ok(stream)) = stream.get_untracked() {
94+
if let Some(sendwrapped_stream) = stream.get_untracked()
95+
&& let Ok(stream) = sendwrapped_stream.as_ref()
96+
{
9497
for track in stream.get_tracks() {
9598
track.unchecked_ref::<web_sys::MediaStreamTrack>().stop();
9699
}
@@ -111,7 +114,9 @@ pub fn use_user_media_with_options(
111114
async move {
112115
_start().await;
113116
stream.with_untracked(move |stream| {
114-
if let Some(Ok(_)) = stream {
117+
if let Some(sendwrapped_stream) = stream
118+
&& sendwrapped_stream.as_ref().is_ok()
119+
{
115120
set_enabled.set(true);
116121
}
117122
});
@@ -311,7 +316,7 @@ where
311316
/// Initially this is `None` until `start` resolved successfully.
312317
/// In case the stream couldn't be started, for example because the user didn't grant permission,
313318
/// this has the value `Some(Err(...))`.
314-
pub stream: Signal<Option<Result<web_sys::MediaStream, JsValue>>, LocalStorage>,
319+
pub stream: OptionLocalSignal<Result<web_sys::MediaStream, JsValue>>,
315320

316321
/// Starts the screen streaming. Triggers the ask for permission if not already granted.
317322
pub start: StartFn,

0 commit comments

Comments
 (0)