use leptos::{ IntoView, html::{ElementChild, button, label}, logging::log, prelude::{OnAttribute, Read, Show, ShowProps, ToChildren}, server::LocalResource, }; use wasm_bindgen_futures::spawn_local; use crate::{media::audio, signal::wait_until_communication_is_ready, webrtc::WebRTC}; pub fn app() -> impl IntoView { let audio_stream = LocalResource::new(|| audio()); let wait_until_communication_is_ready = LocalResource::new(|| wait_until_communication_is_ready()); let props = ShowProps::builder() .when(move || { audio_stream.read().is_some() && wait_until_communication_is_ready.read().is_some() }) .children(ToChildren::to_children(move || { let audio_stream = audio_stream.read(); let audio_stream = audio_stream.as_deref().unwrap().clone(); let webrtc = WebRTC::new(Some(audio_stream), None, None).unwrap(); let webrtc_offer = webrtc.clone(); let offer_button = button() .on(leptos::ev::click, move |_| { let webrtc_offer = webrtc_offer.clone(); log!("{:#?}", webrtc_offer.get_status()); spawn_local(async move { let offer_result = webrtc_offer.offer().await; log!("Offer Result Is = {:#?}", offer_result); }); }) .child("Offer"); let webrtc_answer = webrtc.clone(); let answer_button = button() .on(leptos::ev::click, move |_| { let webrtc_answer = webrtc_answer.clone(); spawn_local(async move { let answer_result = webrtc_answer.answer().await; log!("Answer Result Is = {:#?}", answer_result); }); }) .child("Answer"); (offer_button, answer_button) })) .fallback(|| label().child("NOOOOOOOOOOOO")) .build(); Show(props) }