use perspective_client::config::ViewConfigUpdate;
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.get_view()) }).await?;
Ok(())
})
})
}
fn resize_callback(&self) -> Callback<()> {
clone!(self.renderer(), self.session());
Callback::from(move |_| {
clone!(renderer, session);
ApiFuture::spawn(async move {
if !renderer.is_plugin_activated()? {
update_and_render(session, renderer).await?
} else {
renderer.resize().await?;
}
Ok(())
})
})
}
fn update_and_render(&self, update: ViewConfigUpdate) -> ApiResult<ApiFuture<()>> {
self.session().update_view_config(update)?;
clone!(self.session(), self.renderer());
Ok(ApiFuture::new(update_and_render(session, renderer)))
}
fn just_render(&self) -> ApiResult<ApiFuture<()>> {
clone!(self.session(), self.renderer());
Ok(ApiFuture::new(update_and_render(session, renderer)))
}
}
#[tracing::instrument(level = "debug", skip(session, renderer))]
async fn update_and_render(session: Session, renderer: Renderer) -> ApiResult<()> {
if session.get_error().is_some() {
return Ok(());
}
renderer.apply_pending_plugin()?;
let view = session.validate().await?;
renderer.draw(view.create_view()).await
}
impl<T: HasRenderer + HasSession> UpdateAndRender for T {}