diff --git a/src/BlazorUI/Bit.BlazorUI/Components/Notifications/Message/BitMessage.razor.cs b/src/BlazorUI/Bit.BlazorUI/Components/Notifications/Message/BitMessage.razor.cs index 0c57c263ef..357e37b19c 100644 --- a/src/BlazorUI/Bit.BlazorUI/Components/Notifications/Message/BitMessage.razor.cs +++ b/src/BlazorUI/Bit.BlazorUI/Components/Notifications/Message/BitMessage.razor.cs @@ -6,6 +6,7 @@ public partial class BitMessage : BitComponentBase { private bool _isExpanded; + private CancellationTokenSource? _autoDismissCts; @@ -20,6 +21,11 @@ public partial class BitMessage : BitComponentBase [Parameter, ResetStyleBuilder] public BitAlignment? Alignment { get; set; } + /// + /// Enables the auto-dismiss feature and sets the time to automatically call the OnDismiss callback. + /// + [Parameter] public TimeSpan? AutoDismissTime { get; set; } + /// /// The content of message. /// @@ -178,7 +184,33 @@ protected override void RegisterCssClasses() }); } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + + if (firstRender is false) return; + if (OnDismiss.HasDelegate is false) return; + if (AutoDismissTime is not { } delay || delay <= TimeSpan.Zero) return; + _autoDismissCts?.Cancel(); + _autoDismissCts = new CancellationTokenSource(); + _ = AutoDismissAsync(delay, _autoDismissCts.Token); + } + + + + private async Task AutoDismissAsync(TimeSpan delay, CancellationToken ct) + { + try + { + await Task.Delay(delay, ct); + + if (ct.IsCancellationRequested || OnDismiss.HasDelegate is false) return; + + await InvokeAsync(OnDismiss.InvokeAsync); + } + catch (TaskCanceledException) { } + } private void ToggleExpand() => _isExpanded = _isExpanded is false; @@ -188,6 +220,18 @@ protected override void RegisterCssClasses() + protected override async ValueTask DisposeAsync(bool disposing) + { + if (IsDisposed || disposing is false) return; + + _autoDismissCts?.Cancel(); + _autoDismissCts?.Dispose(); + + await base.DisposeAsync(disposing); + } + + + private static Dictionary _IconMap = new() { [BitColor.Primary] = "Info", diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor index 9a30c981e4..e8b17b9e6f 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor @@ -151,6 +151,19 @@ { Dismissed, click to reset } + +

+ + @if (isAutoDismissed is false) + { + + Auto-Dismiss option enabled by adding the AutoDismissTime parameter alongside OnDismiss. + + } + else + { + Auto-Dismissed, click to reset + } diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.cs b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.cs index 03a4472870..ade5c1b62c 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.cs +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.cs @@ -21,6 +21,13 @@ public partial class BitMessageDemo Href = "#alignment-enum", }, new() + { + Name = "AutoDismissTime", + Type = "TimeSpan?", + DefaultValue = "null", + Description = "Enables the auto-dismiss feature and sets the time to automatically call the OnDismiss callback.", + }, + new() { Name = "ChildContent", Type = "RenderFragment?", @@ -474,6 +481,8 @@ public partial class BitMessageDemo private bool isDismissed; + private bool isAutoDismissed; + private double elevation = 7; private bool isErrorDismissed; private bool isWarningDismissed; diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.samples.cs b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.samples.cs index 6900bf64c4..63ea2fce1a 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.samples.cs +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Notifications/Message/BitMessageDemo.razor.samples.cs @@ -106,9 +106,21 @@ Dismiss option enabled by adding OnDismiss parameter. else { isDismissed = false"">Dismissed, click to reset +} + +@if (isAutoDismissed is false) +{ + isAutoDismissed = true""> + Auto-Dismiss option enabled by adding AutoDismissTime parameter alongside of OnDismiss. + +} +else +{ + isAutoDismissed = false"">Auto-Dismissed, click to reset }"; private readonly string example8CsharpCode = @" -private bool isDismissed;"; +private bool isDismissed; +private bool isAutoDismissed;"; private readonly string example9RazorCode = @"