2025-04-02 03:27:59 +03:00
|
|
|
use leptos::{
|
2025-04-11 04:58:16 +03:00
|
|
|
IntoView,
|
|
|
|
attr::Value,
|
|
|
|
ev,
|
|
|
|
html::{ElementChild, button, form, input},
|
2025-04-02 03:27:59 +03:00
|
|
|
logging::log,
|
2025-04-13 04:55:33 +03:00
|
|
|
prelude::{
|
|
|
|
BindAttribute, Get, OnAttribute, Read, ReadSignal, Show, ShowProps, ToChildren,
|
|
|
|
WriteSignal, signal,
|
|
|
|
},
|
2025-04-02 03:27:59 +03:00
|
|
|
server::LocalResource,
|
|
|
|
task::spawn_local,
|
|
|
|
};
|
|
|
|
use wasm_bindgen_futures::JsFuture;
|
2025-04-11 04:58:16 +03:00
|
|
|
use web_sys::HtmlAudioElement;
|
|
|
|
|
2025-04-15 04:23:38 +03:00
|
|
|
use crate::{
|
|
|
|
media::audio,
|
|
|
|
rtc::{answer, offer},
|
|
|
|
signal::start_signalling,
|
|
|
|
};
|
2025-04-02 03:27:59 +03:00
|
|
|
|
|
|
|
pub fn app() -> impl IntoView {
|
2025-04-11 04:58:16 +03:00
|
|
|
let audio_stream = LocalResource::new(|| audio());
|
2025-04-02 03:27:59 +03:00
|
|
|
let props = ShowProps::builder()
|
|
|
|
.when(move || audio_stream.read().is_some())
|
|
|
|
.children(ToChildren::to_children(move || {
|
|
|
|
let audio_element = HtmlAudioElement::new().unwrap();
|
|
|
|
let audio_stream = audio_stream.read();
|
|
|
|
let audio_stream = audio_stream.as_deref();
|
|
|
|
audio_element.set_src_object(audio_stream);
|
|
|
|
button()
|
|
|
|
.on(ev::click, move |_| match audio_element.play() {
|
|
|
|
Ok(audio_element_play_promise) => {
|
|
|
|
log!("{}", "Play will");
|
|
|
|
spawn_local(async move {
|
|
|
|
JsFuture::from(audio_element_play_promise).await.ok();
|
|
|
|
});
|
|
|
|
log!("{}", "Play must");
|
|
|
|
}
|
|
|
|
Err(err_val) => log!("{:#?}", err_val),
|
|
|
|
})
|
|
|
|
.child("Happy Button")
|
|
|
|
.into_view()
|
|
|
|
}))
|
|
|
|
.fallback(|| button().child("Sad Button"))
|
|
|
|
.build();
|
2025-04-13 04:55:33 +03:00
|
|
|
let username = signal(String::from(""));
|
2025-04-15 04:23:38 +03:00
|
|
|
(
|
|
|
|
Show(props),
|
|
|
|
signalling(username),
|
|
|
|
rtc_offer(username.0),
|
|
|
|
rtc_answer(username.0),
|
|
|
|
)
|
2025-04-02 03:27:59 +03:00
|
|
|
}
|
|
|
|
|
2025-04-13 04:55:33 +03:00
|
|
|
fn signalling(username: (ReadSignal<String>, WriteSignal<String>)) -> impl IntoView {
|
2025-04-11 04:58:16 +03:00
|
|
|
let signalling_trigger = move || {
|
2025-04-13 04:55:33 +03:00
|
|
|
spawn_local(start_signalling(username.0.get()));
|
2025-04-11 04:58:16 +03:00
|
|
|
};
|
|
|
|
let signalling_server_input = form()
|
|
|
|
.child(
|
|
|
|
input()
|
2025-04-13 04:55:33 +03:00
|
|
|
.bind(Value, username)
|
|
|
|
.placeholder("Some Username")
|
2025-04-11 04:58:16 +03:00
|
|
|
.r#type("text"),
|
|
|
|
)
|
|
|
|
.on(ev::submit, move |event| {
|
|
|
|
event.prevent_default();
|
2025-04-13 04:55:33 +03:00
|
|
|
signalling_trigger();
|
2025-04-11 04:58:16 +03:00
|
|
|
});
|
2025-04-07 01:52:52 +03:00
|
|
|
|
2025-04-11 04:58:16 +03:00
|
|
|
let signalling_submit_button = button()
|
2025-04-13 04:55:33 +03:00
|
|
|
.on(ev::click, move |event| {
|
|
|
|
event.prevent_default();
|
|
|
|
signalling_trigger();
|
|
|
|
})
|
2025-04-11 04:58:16 +03:00
|
|
|
.child("Signal");
|
|
|
|
(signalling_server_input, signalling_submit_button)
|
|
|
|
}
|
2025-04-07 01:52:52 +03:00
|
|
|
|
2025-04-15 04:23:38 +03:00
|
|
|
fn rtc_offer(username: ReadSignal<String>) -> impl IntoView {
|
|
|
|
let offer_trigger = move || {
|
2025-04-17 04:09:18 +03:00
|
|
|
spawn_local(async move {
|
|
|
|
let peer_connection = offer(username.get()).await;
|
|
|
|
});
|
2025-04-11 04:58:16 +03:00
|
|
|
};
|
2025-04-07 01:52:52 +03:00
|
|
|
|
2025-04-15 04:23:38 +03:00
|
|
|
let offer_button = button()
|
2025-04-13 04:55:33 +03:00
|
|
|
.on(ev::click, move |event| {
|
|
|
|
event.prevent_default();
|
2025-04-15 04:23:38 +03:00
|
|
|
offer_trigger();
|
2025-04-13 04:55:33 +03:00
|
|
|
})
|
2025-04-11 04:58:16 +03:00
|
|
|
.child("RTC Offer");
|
2025-04-15 04:23:38 +03:00
|
|
|
offer_button
|
|
|
|
}
|
|
|
|
|
|
|
|
fn rtc_answer(username: ReadSignal<String>) -> impl IntoView {
|
|
|
|
let answer_trigger = move || {
|
2025-04-17 04:09:18 +03:00
|
|
|
spawn_local(async move {
|
|
|
|
let peer_connection = answer(username.get()).await;
|
|
|
|
});
|
2025-04-15 04:23:38 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
let answer_button = button()
|
|
|
|
.on(ev::click, move |event| {
|
|
|
|
event.prevent_default();
|
|
|
|
answer_trigger();
|
|
|
|
})
|
|
|
|
.child("RTC Answer");
|
|
|
|
answer_button
|
2025-04-02 03:27:59 +03:00
|
|
|
}
|