diff --git a/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs index 89fa1d57..6030470b 100644 --- a/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Blocks/Workspaces.razor.cs @@ -5,6 +5,7 @@ using System.Text.Json.Serialization; using AIStudio.Chat; using AIStudio.Components.CommonDialogs; using AIStudio.Settings; +using AIStudio.Tools; using Microsoft.AspNetCore.Components; @@ -235,6 +236,20 @@ public partial class Workspaces : ComponentBase if(!Directory.Exists(chatPath)) return null; + + // Check if the chat has unsaved changes: + if (switchToChat && await MessageBus.INSTANCE.SendMessageUseFirstResult(this, Event.HAS_CHAT_UNSAVED_CHANGES)) + { + var dialogParameters = new DialogParameters + { + { "Message", "Are you sure you want to load another chat? All unsaved changes will be lost." }, + }; + + var dialogReference = await this.DialogService.ShowAsync("Load Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult.Canceled) + return null; + } try { @@ -450,6 +465,20 @@ public partial class Workspaces : ComponentBase private async Task AddChat(string workspacePath) { + // Check if the chat has unsaved changes: + if (await MessageBus.INSTANCE.SendMessageUseFirstResult(this, Event.HAS_CHAT_UNSAVED_CHANGES)) + { + var dialogParameters = new DialogParameters + { + { "Message", "Are you sure you want to create a another chat? All unsaved changes will be lost." }, + }; + + var dialogReference = await this.DialogService.ShowAsync("Create Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult.Canceled) + return; + } + var workspaceId = Guid.Parse(Path.GetFileName(workspacePath)); var chat = new ChatThread { diff --git a/app/MindWork AI Studio/Components/Pages/Chat.razor b/app/MindWork AI Studio/Components/Pages/Chat.razor index f37c427d..dabe31cc 100644 --- a/app/MindWork AI Studio/Components/Pages/Chat.razor +++ b/app/MindWork AI Studio/Components/Pages/Chat.razor @@ -2,6 +2,8 @@ @using AIStudio.Chat @using AIStudio.Settings +@inherits AIStudio.Tools.MSGComponentBase + @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) { diff --git a/app/MindWork AI Studio/Components/Pages/Chat.razor.cs b/app/MindWork AI Studio/Components/Pages/Chat.razor.cs index 817c43b6..49cde7d2 100644 --- a/app/MindWork AI Studio/Components/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Components/Pages/Chat.razor.cs @@ -3,6 +3,7 @@ using AIStudio.Components.Blocks; using AIStudio.Components.CommonDialogs; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; @@ -14,7 +15,7 @@ namespace AIStudio.Components.Pages; /// /// The chat page. /// -public partial class Chat : ComponentBase, IAsyncDisposable +public partial class Chat : MSGComponentBase, IAsyncDisposable { [Inject] private SettingsManager SettingsManager { get; set; } = null!; @@ -50,6 +51,8 @@ public partial class Chat : ComponentBase, IAsyncDisposable protected override async Task OnInitializedAsync() { + this.ApplyFilters([], [ Event.HAS_CHAT_UNSAVED_CHANGES ]); + // Configure the spellchecking for the user input: this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); @@ -332,6 +335,29 @@ public partial class Chat : ComponentBase, IAsyncDisposable await this.inputField.Clear(); } + #region Overrides of MSGComponentBase + + public override Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + { + return Task.CompletedTask; + } + + public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default + { + switch (triggeredEvent) + { + case Event.HAS_CHAT_UNSAVED_CHANGES: + if(this.SettingsManager.ConfigurationData.WorkspaceStorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) + return Task.FromResult((TResult?) (object) false); + + return Task.FromResult((TResult?)(object)this.hasUnsavedChanges); + } + + return Task.FromResult(default(TResult)); + } + + #endregion + #region Implementation of IAsyncDisposable public async ValueTask DisposeAsync()