@inject GlobalNotificationService GlobalNotificationService
@inject NavigationManager NavigationManager
@implements IDisposable
@if (Messages.Count == 0)
{
return;
}
@foreach (var message in Messages)
{
if (message.Key == "success")
{
}
}
@foreach (var message in Messages)
{
if (message.Key == "error")
{
}
}
@code {
private List> Messages { get; set; } = new();
///
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
if (firstRender)
{
RefreshAddMessages();
GlobalNotificationService.OnChange += RefreshAddMessages;
NavigationManager.LocationChanged += HandleLocationChanged;
}
}
///
public void Dispose()
{
GlobalNotificationService.OnChange -= RefreshAddMessages;
NavigationManager.LocationChanged -= HandleLocationChanged;
}
///
/// Refreshes the messages on navigation to another page.
///
private void HandleLocationChanged(object? sender, LocationChangedEventArgs e)
{
RefreshAddMessages();
}
///
/// Refreshes the messages by adding any new messages from the PortalMessageService.
///
private void RefreshAddMessages()
{
// We retrieve any additional messages from the GlobalNotificationService that we do not yet have.
var newMessages = GlobalNotificationService.GetMessagesForDisplay();
bool hasChanges = false;
// Check for new messages
foreach (var message in newMessages)
{
if (!Messages.Exists(m => m.Key == message.Key && m.Value == message.Value))
{
Messages.Add(message);
hasChanges = true;
}
}
// Check for messages to remove
var messagesToRemove = Messages.Where(m => !newMessages.Exists(nm => nm.Key == m.Key && nm.Value == m.Value)).ToList();
if (messagesToRemove.Any())
{
foreach (var message in messagesToRemove)
{
Messages.Remove(message);
}
hasChanges = true;
}
// Only call StateHasChanged if there were actual changes
if (hasChanges)
{
InvokeAsync(StateHasChanged);
}
}
}