@using Microsoft.CodeAnalysis @implements IAsyncDisposable @inject ConsoleHubClient consoleHub @inject IJSRuntime JS
@foreach(var console in Consoles) { }
@code { private ElementReference ScrollViewDiv; private List Consoles = []; public void AddInfo(string message) => AddMessage(DiagnosticSeverity.Info, message); public void AddWarning(string message) => AddMessage(DiagnosticSeverity.Warning, message); public void AddError(string message) => AddMessage(DiagnosticSeverity.Error, message); public async void AddMessage(DiagnosticSeverity severity, string message) { if (Consoles.Any() && Consoles[^1].Severity == severity) { Consoles[^1].Append(message); } else { Consoles.Add(new ConsoleItemModel(severity, message)); StateHasChanged(); } // Đợi UI cập nhật xong rồi scroll await Task.Yield(); await JS.InvokeVoidAsync("ScrollToBottom", ScrollViewDiv); } public void Clear() { Consoles.Clear(); StateHasChanged(); } protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); consoleHub.MessageInfo += AddInfo; consoleHub.MessageWarning += AddWarning; consoleHub.MessageError += AddError; await consoleHub.StartAsync(); await consoleHub.RegisterAllConsoles(); } public async ValueTask DisposeAsync() { consoleHub.MessageInfo -= AddInfo; consoleHub.MessageWarning -= AddWarning; consoleHub.MessageError -= AddError; await consoleHub.UnregisterAllConsoles(); await consoleHub.StopAsync(); } }