use yew::prelude::*;
use super::structural::*;
use crate::renderer::Renderer;
use crate::session::Session;
use crate::utils::*;
use crate::*;
pub trait UpdateAndRender: HasRenderer + HasSession {
fn render_callback(&self) -> Callback<()> {
clone!(self.session(), self.renderer());
Callback::from(move |_| {
clone!(session, renderer);
ApiFuture::spawn(async move {
renderer.draw(async { Ok(&session) }).await?;
Ok(())
})
})
}
fn update_and_render(&self, update: crate::config::ViewConfigUpdate) -> ApiFuture<()> {
self.session().update_view_config(update);
clone!(self.session(), self.renderer());
ApiFuture::new(update_and_render(session, renderer))
}
}
async fn update_and_render(session: Session, renderer: Renderer) -> ApiResult<()> {
let view = session.validate().await?;
renderer.draw(view.create_view()).await?;
Ok(())
}
impl<T: HasRenderer + HasSession> UpdateAndRender for T {}