use leptos::{ IntoView, attr::Value, ev, html::{ElementChild, button, form, input}, logging::log, prelude::{BindAttribute, Get, OnAttribute, Read, Show, ShowProps, ToChildren, signal}, server::LocalResource, task::spawn_local, }; use wasm_bindgen_futures::JsFuture; use web_sys::HtmlAudioElement; use crate::{media::audio, rtc::offer, signal::start_signalling}; pub fn app() -> impl IntoView { let audio_stream = LocalResource::new(|| audio()); 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(); (Show(props), signalling(), rtc()) } fn signalling() -> impl IntoView { let signalling_server_input_data = signal(String::new()); let signalling_trigger = move || { spawn_local(start_signalling( "Zurna Dürüm".to_string(), signalling_server_input_data.0.get(), )) }; let signalling_server_input = form() .child( input() .bind(Value, signalling_server_input_data) .placeholder("0.0.0.0:4546") .r#type("text"), ) .on(ev::submit, move |event| { event.prevent_default(); signalling_trigger() }); let signalling_submit_button = button() .on(ev::click, move |_| signalling_trigger()) .child("Signal"); (signalling_server_input, signalling_submit_button) } fn rtc() -> impl IntoView { let rtc_trigger = || { spawn_local(offer()); }; let rtc_start_button = button() .on(ev::click, move |_| rtc_trigger()) .child("RTC Offer"); rtc_start_button }