use async_trait::async_trait;
use extend::ext;
use futures::channel::oneshot::*;
use yew::html::Scope;
use yew::prelude::*;
use super::ApiResult;
#[ext]
pub impl<T> Scope<T>
where
T: Component,
{
fn send_message_async<F, U>(&self, f: F) -> Receiver<U>
where
F: FnOnce(Sender<U>) -> T::Message,
{
let (sender, receiver) = channel::<U>();
self.send_message(f(sender));
receiver
}
}
#[ext]
#[async_trait(?Send)]
pub impl<T> Callback<Sender<T>>
where
T: 'static,
{
async fn emit_async_safe(&self) -> ApiResult<T> {
let (sender, receiver) = channel::<T>();
self.emit(sender);
Ok(receiver.await?)
}
}