use futures::future::join_all;
use perspective_client::clone;
use perspective_js::utils::{ApiError, ApiResult};
use yew::Component;
use crate::ApiFuture;
use crate::root::Root;
use crate::session::{ResetOptions, TableIntermediateState};
use crate::workspace::Workspace;
pub fn delete_all<T: Component>(workspace: &Workspace, root: &Root<T>) -> ApiFuture<()> {
clone!(workspace, root);
ApiFuture::new(async move {
let panels = workspace
.take_reserved()
.into_iter()
.chain(
workspace
.panel_ids()
.into_iter()
.filter_map(|id| workspace.panel(&id)),
)
.collect::<Vec<_>>();
let results = join_all(panels.iter().map(|panel| {
clone!(panel.session, panel.renderer);
session.table_unloaded.emit(false);
let was_errored = session.is_errored();
renderer.clone().with_lock(async move {
renderer.delete()?;
let reset = session
.reset(ResetOptions {
config: true,
expressions: true,
table: Some(TableIntermediateState::Ejected),
..ResetOptions::default()
})
.await;
match reset {
Err(_) if was_errored => Ok(()),
other => other,
}
})
}))
.await;
let root_result = root
.borrow_mut()
.take()
.ok_or_else(|| ApiError::from("Already deleted"))
.map(|x| x.destroy());
results.into_iter().collect::<ApiResult<Vec<_>>>()?;
root_result?;
Ok(())
})
}