diff --git a/app/MindWork AI Studio/Components/Blocks/InnerScrolling.razor.cs b/app/MindWork AI Studio/Components/Blocks/InnerScrolling.razor.cs index 4dee88c7..22483e78 100644 --- a/app/MindWork AI Studio/Components/Blocks/InnerScrolling.razor.cs +++ b/app/MindWork AI Studio/Components/Blocks/InnerScrolling.razor.cs @@ -51,6 +51,11 @@ public partial class InnerScrolling : MSGComponentBase return Task.CompletedTask; } + public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default + { + return Task.FromResult(default(TResult)); + } + #endregion private string Height => $"height: calc(100vh - {this.HeaderHeight} - {this.MainLayout.AdditionalHeight});"; diff --git a/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs index 94dfabe7..852d346a 100644 --- a/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Components/Layout/MainLayout.razor.cs @@ -92,6 +92,11 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver } } + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return Task.FromResult(default); + } + #endregion private async Task DismissUpdate() diff --git a/app/MindWork AI Studio/Tools/Event.cs b/app/MindWork AI Studio/Tools/Event.cs index 2b259f4a..9f55552e 100644 --- a/app/MindWork AI Studio/Tools/Event.cs +++ b/app/MindWork AI Studio/Tools/Event.cs @@ -10,4 +10,7 @@ public enum Event // Update events: USER_SEARCH_FOR_UPDATE, UPDATE_AVAILABLE, + + // Chat events: + HAS_CHAT_UNSAVED_CHANGES, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs index 401a2118..019ce115 100644 --- a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs +++ b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs @@ -5,4 +5,6 @@ namespace AIStudio.Tools; public interface IMessageBusReceiver { public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data); + + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/MSGComponentBase.cs b/app/MindWork AI Studio/Tools/MSGComponentBase.cs index b8ccaf82..ff72e0e7 100644 --- a/app/MindWork AI Studio/Tools/MSGComponentBase.cs +++ b/app/MindWork AI Studio/Tools/MSGComponentBase.cs @@ -20,6 +20,8 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus #region Implementation of IMessageBusReceiver public abstract Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data); + + public abstract Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data); #endregion @@ -37,6 +39,11 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus await this.MessageBus.SendMessage(this, triggeredEvent, data); } + protected async Task SendMessageWithResult(Event triggeredEvent, TPayload? data) + { + return await this.MessageBus.SendMessageUseFirstResult(this, triggeredEvent, data); + } + protected void ApplyFilters(ComponentBase[] components, Event[] events) { this.MessageBus.ApplyFilters(this, components, events); diff --git a/app/MindWork AI Studio/Tools/MessageBus.cs b/app/MindWork AI Studio/Tools/MessageBus.cs index 53b215c7..9a6aac88 100644 --- a/app/MindWork AI Studio/Tools/MessageBus.cs +++ b/app/MindWork AI Studio/Tools/MessageBus.cs @@ -64,4 +64,23 @@ public sealed class MessageBus this.sendingSemaphore.Release(); } } + + public async Task SendMessageUseFirstResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data = default) + { + foreach (var (receiver, componentFilter) in this.componentFilters) + { + if (componentFilter.Length > 0 && sendingComponent is not null && !componentFilter.Contains(sendingComponent)) + continue; + + var eventFilter = this.componentEvents[receiver]; + if (eventFilter.Length == 0 || eventFilter.Contains(triggeredEvent)) + { + var result = await receiver.ProcessMessageWithResult(sendingComponent, triggeredEvent, data); + if (result is not null) + return (TResult) result; + } + } + + return default; + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/UpdateService.cs b/app/MindWork AI Studio/Tools/UpdateService.cs index 1c8a5f7a..29193430 100644 --- a/app/MindWork AI Studio/Tools/UpdateService.cs +++ b/app/MindWork AI Studio/Tools/UpdateService.cs @@ -72,6 +72,11 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver break; } } + + public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return Task.FromResult(default); + } #endregion