use perspective_client::config::ViewConfigUpdate;
use yew::prelude::*;
use crate::renderer::Renderer;
use crate::session::Session;
use crate::utils::*;
use crate::*;
pub fn render_callback(session: &Session, renderer: &Renderer) -> Callback<()> {
clone!(session, renderer);
Callback::from(move |_| {
clone!(session, renderer);
ApiFuture::spawn(async move {
renderer.draw(async { Ok(session.get_view()) }).await?;
Ok(())
})
})
}
pub fn resize_callback(session: &Session, renderer: &Renderer) -> Callback<()> {
clone!(session, renderer);
Callback::from(move |_| {
clone!(renderer, session);
ApiFuture::spawn(async move {
if !renderer.is_plugin_activated()? {
update_and_render_inner(session, renderer).await?
} else {
renderer.resize().await?;
}
Ok(())
})
})
}
pub fn update_and_render(
session: &Session,
renderer: &Renderer,
update: ViewConfigUpdate,
) -> ApiResult<ApiFuture<()>> {
session.update_view_config(update)?;
clone!(session, renderer);
Ok(ApiFuture::new(update_and_render_inner(session, renderer)))
}
pub fn just_render(session: &Session, renderer: &Renderer) -> ApiResult<ApiFuture<()>> {
clone!(session, renderer);
Ok(ApiFuture::new(update_and_render_inner(session, renderer)))
}
#[tracing::instrument(level = "debug", skip(session, renderer))]
async fn update_and_render_inner(session: Session, renderer: Renderer) -> ApiResult<()> {
if session.get_error().is_some() {
return Ok(());
}
let plugin_swapped = renderer.apply_pending_plugin()?;
if plugin_swapped {
let view_config_snapshot = session.get_view_config().clone();
let plugin_token = wasm_bindgen::JsValue::from_serde_ext(&renderer.get_plugin_config())
.unwrap_or(wasm_bindgen::JsValue::NULL);
let columns_config =
renderer.all_columns_configs_materialized(&view_config_snapshot, &session);
renderer
.get_active_plugin()?
.restore(&plugin_token, Some(&columns_config))?;
}
let view = session.validate().await?;
renderer.draw(view.create_view()).await
}