use futures::FutureExt;
use perspective_client::clone;
use perspective_js::utils::*;
use crate::config::ColumnConfigFieldUpdate;
use crate::renderer::{Renderer, StagedEdit};
use crate::session::{EditDelta, OpKind, Session};
pub fn send_plugin_config(session: &Session, renderer: &Renderer, update: ColumnConfigFieldUpdate) {
let staged = renderer.stage(StagedEdit::PluginField(update.clone()));
let kind = OpKind::Edit {
delta: EditDelta::Renderer,
swaps_plugin: false,
};
let ticket = session.submit(kind, {
clone!(session, renderer);
move |_ctx| {
Box::pin(async move {
let view_config = session.committed_view_config().clone();
let changed = renderer.update_plugin_config_field(&view_config, update);
drop(staged);
Ok(Some(
async move {
if changed {
deliver_plugin_config(&session, &renderer).await?;
}
Ok(())
}
.boxed_local(),
))
})
}
});
ApiFuture::spawn(ticket.settle());
}
pub(super) async fn deliver_plugin_config(session: &Session, renderer: &Renderer) -> ApiResult<()> {
let plugin_config = renderer.committed_plugin_config();
let plugin_token = wasm_bindgen::JsValue::from_serde_ext(&plugin_config).unwrap();
let view_config_snapshot = session.committed_view_config().clone();
let columns_configs = renderer
.all_columns_configs_materialized(&view_config_snapshot, session)
.await;
renderer
.ensure_plugin_selected()?
.restore(&plugin_token, Some(&columns_configs))?;
clone!(session);
renderer
.update_lazy(async move { Ok(session.get_view_with_dimensions()) })
.await?;
renderer.plugin_config_changed.emit(plugin_config);
Ok(())
}