using AIStudio.Chat; using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; public partial class MudCopyClipboardButton : ComponentBase { private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(MudCopyClipboardButton).Namespace, nameof(MudCopyClipboardButton)); /// /// The string, if you want to copy a string. /// [Parameter] public string StringContent { get; set; } = string.Empty; /// /// The content, if you want to copy content. /// [Parameter] public IContent? Content { get; init; } /// /// The content type, if you want to copy Content. /// [Parameter] public ContentType Type { get; init; } = ContentType.NONE; /// /// The tooltip that should be shown to the user. /// [Parameter] public string TooltipMessage { get; set; } = TB("Copies the content to the clipboard"); /// /// The size of the button. The default size is small. /// [Parameter] public Size Size { get; set; } = Size.Small; [Inject] private RustService RustService { get; init; } = null!; private async Task HandleCopyClick() { if (this.Type is ContentType.NONE) await this.CopyToClipboard(this.StringContent); else await this.CopyToClipboard(this.Content); } /// /// Copy this the string to the clipboard. /// private async Task CopyToClipboard(string textContent) { await this.RustService.CopyText2Clipboard(textContent); } /// /// Copy this block's content to the clipboard. /// private async Task CopyToClipboard(IContent? contentToCopy) { if (contentToCopy is null) return; switch (this.Type) { case ContentType.TEXT: var textContent = (ContentText) contentToCopy; await this.RustService.CopyText2Clipboard(textContent.Text); break; default: // This component is no MSGComponentBase, so it uses the shared bus instance the same // way FileExtensionValidation does: await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.ContentCopy, TB("Cannot copy this content type to clipboard."))); break; } } }