diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index eab51b12..7e048459 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -107,6 +107,13 @@ } + + @if (context is IAvailablePlugin shareablePlugin && CanSharePlugin(shareablePlugin)) + { + + + + } @if (context is IAvailablePlugin revisionPlugin && CanReviseAssistantPlugin(revisionPlugin)) { diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs index da57e092..d749479c 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor.cs +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -4,7 +4,7 @@ using AIStudio.Dialogs; using AIStudio.Settings.DataModel; using AIStudio.Tools.PluginSystem.Assistants; using AIStudio.Tools.PluginSystem; - +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using DialogOptions = AIStudio.Dialogs.DialogOptions; @@ -27,7 +27,12 @@ public partial class Plugins : MSGComponentBase [Inject] private AssistantPluginAuditService AssistantPluginAuditService { get; init; } = null!; + [Inject] + private PluginShareService PluginShareService { get; init; } = null!; + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(nameof(Plugins)); + + private static bool IS_SHARING_PLUGIN; #region Overrides of ComponentBase @@ -184,15 +189,18 @@ public partial class Plugins : MSGComponentBase : this.T("Enable plugin"); } - private static bool CanEditAssistantPlugin(IAvailablePlugin plugin) => plugin is { IsInternal: false, Type: PluginType.ASSISTANT } && !string.IsNullOrWhiteSpace(plugin.LocalPath); + private static bool CanEditAssistantPlugin(IAvailablePlugin plugin) => plugin is { IsInternal: false, Type: PluginType.ASSISTANT } && + !string.IsNullOrWhiteSpace(plugin.LocalPath) && !IS_SHARING_PLUGIN; private static bool CanReviseAssistantPlugin(IAvailablePlugin plugin) { var assistantPlugin = PluginFactory.RunningPlugins.OfType().FirstOrDefault(x => x.Id == plugin.Id); return plugin is { IsInternal: false, IsManagedByConfigServer: false, Type: PluginType.ASSISTANT } && - !string.IsNullOrWhiteSpace(plugin.LocalPath) && - assistantPlugin?.IsManagedByConfigServer is false; + !string.IsNullOrWhiteSpace(plugin.LocalPath) && assistantPlugin?.IsManagedByConfigServer is false && !IS_SHARING_PLUGIN; } + + private static bool CanSharePlugin(IAvailablePlugin plugin) => plugin is { IsInternal: false, IsManagedByConfigServer: false } && + !string.IsNullOrWhiteSpace(plugin.LocalPath) && !IS_SHARING_PLUGIN; private async Task OpenAssistantPluginEditorDialogAsync(IAvailablePlugin plugin) { @@ -233,6 +241,32 @@ public partial class Plugins : MSGComponentBase await this.InvokeAsync(this.StateHasChanged); } + private async Task SharePluginAsync(IAvailablePlugin plugin) + { + if (IS_SHARING_PLUGIN) + return; + + IS_SHARING_PLUGIN = true; + // invoke a state change right away to guard action buttons + await this.InvokeAsync(this.StateHasChanged); + + try + { + var shareResult = await this.PluginShareService.ShareAsync(plugin, CancellationToken.None); + if (!shareResult.Success) + { + LOG.LogError($"Sharing the plugin '{shareResult.PluginName}' from archive '{shareResult.ArchivePath}' failed with Issue: '{shareResult.Issue}'."); + await this.MessageBus.SendError(new(Icons.Material.Filled.ReportProblem, T("An error occurred while sharing the plugin."))); + return; + } + } + finally + { + IS_SHARING_PLUGIN = false; + await this.InvokeAsync(this.StateHasChanged); + } + } + private static bool IsSendingMail(string sourceUrl) => sourceUrl.TrimStart().StartsWith("mailto:", StringComparison.OrdinalIgnoreCase); private PluginAssistants? TryGetAssistantPlugin(Guid pluginId) => PluginFactory.RunningPlugins.OfType().FirstOrDefault(x => x.Id == pluginId);