@inject IJSRuntime JS @implements IDisposable @if (!string.IsNullOrEmpty(displayMessage)) {
@displayMessage
} @code { [Parameter] public string? Message { get; set; } private string? displayMessage; private CancellationTokenSource? hideCts; protected override async Task OnParametersSetAsync() { if (!string.IsNullOrEmpty(Message) && Message != displayMessage) { hideCts?.Cancel(); hideCts?.Dispose(); hideCts = new CancellationTokenSource(); displayMessage = Message; await InvokeAsync(StateHasChanged); await JS.InvokeVoidAsync("initIcons"); var token = hideCts.Token; _ = HideAfterDelay(token); } } private async Task HideAfterDelay(CancellationToken token) { try { await Task.Delay(3000, token); displayMessage = null; await InvokeAsync(StateHasChanged); } catch (TaskCanceledException) { } } public void Dispose() { hideCts?.Cancel(); hideCts?.Dispose(); } }