diff --git a/apps/yaak-client/lib/initGlobalListeners.tsx b/apps/yaak-client/lib/initGlobalListeners.tsx index cd27f68ec..abdcff969 100644 --- a/apps/yaak-client/lib/initGlobalListeners.tsx +++ b/apps/yaak-client/lib/initGlobalListeners.tsx @@ -44,6 +44,19 @@ export function initGlobalListeners() { color: "danger", timeout: null, message: `Failed to load plugin "${name}": ${err}`, + action: ({ hide }) => ( + + ), }); } }); diff --git a/crates-tauri/yaak-app-client/src/lib.rs b/crates-tauri/yaak-app-client/src/lib.rs index ff3f1fe44..1be81957f 100644 --- a/crates-tauri/yaak-app-client/src/lib.rs +++ b/crates-tauri/yaak-app-client/src/lib.rs @@ -54,7 +54,7 @@ use yaak_plugins::events::{ InternalEventPayload, JsonPrimitive, PluginContext, RenderPurpose, ShowToastRequest, }; use yaak_plugins::manager::PluginManager; -use yaak_plugins::plugin_meta::PluginMetadata; +use yaak_plugins::plugin_meta::{PluginMetadata, get_plugin_meta}; use yaak_plugins::template_callback::PluginTemplateCallback; use yaak_sse::sse::ServerSentEvent; use yaak_tauri_utils::window::WorkspaceWindowTrait; @@ -1512,11 +1512,36 @@ async fn cmd_plugin_info( plugin_manager: State<'_, PluginManager>, ) -> YaakResult { let plugin = app_handle.db().get_plugin(id)?; - Ok(plugin_manager + if let Some(plugin_handle) = plugin_manager .get_plugin_by_dir(plugin.directory.as_str()) .await - .ok_or(GenericError("Failed to find plugin for info".to_string()))? - .info()) + { + return Ok(plugin_handle.info()); + } + + if let Ok(metadata) = get_plugin_meta(&PathBuf::from(&plugin.directory)) { + return Ok(metadata); + } + + Ok(fallback_plugin_metadata(&plugin.directory)) +} + +fn fallback_plugin_metadata(directory: &str) -> PluginMetadata { + let display_name = PathBuf::from(directory) + .file_name() + .and_then(|name| name.to_str()) + .filter(|name| !name.is_empty()) + .unwrap_or(directory) + .to_string(); + + PluginMetadata { + version: "Unavailable".to_string(), + name: directory.to_string(), + display_name, + description: Some(format!("Plugin metadata could not be loaded from {directory}")), + homepage_url: None, + repository_url: None, + } } #[tauri::command] diff --git a/crates/yaak-plugins/src/install.rs b/crates/yaak-plugins/src/install.rs index bafd00ab8..d8ac243f6 100644 --- a/crates/yaak-plugins/src/install.rs +++ b/crates/yaak-plugins/src/install.rs @@ -1,6 +1,6 @@ use crate::api::{PluginVersion, download_plugin_archive, get_plugin}; use crate::checksum::compute_checksum; -use crate::error::Error::PluginErr; +use crate::error::Error::{PluginErr, PluginNotFoundErr}; use crate::error::Result; use crate::events::PluginContext; use crate::manager::PluginManager; @@ -29,7 +29,14 @@ pub async fn delete_and_uninstall( let db = query_manager.connect(); db.delete_plugin_by_id(plugin_id, &update_source)? }; - plugin_manager.uninstall(plugin_context, plugin.directory.as_str()).await?; + if let Err(err) = plugin_manager + .uninstall(plugin_context, plugin.directory.as_str()) + .await + { + if !matches!(err, PluginNotFoundErr(_)) { + return Err(err); + } + } Ok(plugin) }