use futures::channel::oneshot;
use perspective_client::clone;
use perspective_js::utils::ApiFuture;
use super::restore_and_render;
use crate::config::{
ColumnConfigUpdate, OptionalUpdate, PluginConfigUpdate, PluginUpdate, ViewerConfigUpdate,
};
use crate::presentation::Presentation;
use crate::renderer::Renderer;
use crate::session::{ResetOptions, Session};
pub fn reset_all(
session: &Session,
renderer: &Renderer,
presentation: &Presentation,
all: bool,
sender: Option<oneshot::Sender<()>>,
) {
presentation.set_open_column_settings(None);
clone!(session, renderer, presentation);
ApiFuture::spawn(async move {
session
.reset(ResetOptions {
config: true,
expressions: all,
..ResetOptions::default()
})
.await?;
presentation.reset_available_themes(None).await;
if all {
presentation.reset_theme().await?;
}
let (columns_config, plugin_config) = if all {
(
ColumnConfigUpdate::SetDefault,
PluginConfigUpdate::SetDefault,
)
} else {
(OptionalUpdate::Missing, OptionalUpdate::Missing)
};
let update = ViewerConfigUpdate {
plugin: PluginUpdate::SetDefault,
plugin_config,
columns_config,
..Default::default()
};
restore_and_render(&session, &renderer, &presentation, update, async { Ok(()) }).await?;
if let Some(sender) = sender {
sender.send(()).unwrap();
}
renderer.reset_changed.emit(());
Ok(())
})
}