@* Toast: Zeigt kurze Benachrichtigungen an. Ersetzt AlertifyJS aus dem Web-Projekt.
Wird einmal im MainLayout platziert. Hört auf den ToastService.
Wenn eine Komponente irgendwo _toast.ShowSuccess("Text") aufruft,
erscheint hier ein Toast und verschwindet nach 4 Sekunden automatisch.
Bootstrap Toast-Klassen werden genutzt:
- toast-container: Positionierung (oben rechts)
- toast: Einzelner Toast
- bg-success/bg-danger/etc: Farbe basierend auf Typ *@
@inject ToastService ToastService
@implements IDisposable
@if (ToastService.Messages.Count > 0)
{
@* toast-container: Bootstrap-Klasse die Toasts oben rechts positioniert.
position-fixed: Bleibt an der Stelle auch beim Scrollen.
z-index 1080: Über dem Modal-Backdrop (1070) damit Toasts
auch während eines ConfirmDialogs sichtbar sind. *@
@foreach (var message in ToastService.Messages)
{
@message.Text
}
}
@code {
protected override void OnInitialized()
{
// Subscriber: Wenn der ToastService eine Änderung meldet,
// zeichnet diese Komponente sich neu (StateHasChanged).
// So erscheinen/verschwinden Toasts automatisch.
ToastService.OnChange += HandleChange;
}
///
/// InvokeAsync ist nötig weil OnChange von einem
/// async void (dem Timer im ToastService) ausgelöst wird.
/// Das kann auf einem anderen Thread passieren.
/// InvokeAsync wechselt zurück auf den Blazor UI-Thread.
///
private async void HandleChange()
{
await InvokeAsync(StateHasChanged);
}
///
/// Event-Handler abmelden wenn die Komponente entfernt wird.
/// Ohne das würde der ToastService eine Referenz auf eine
/// nicht mehr existierende Komponente halten → Memory Leak.
///
public void Dispose()
{
ToastService.OnChange -= HandleChange;
}
}