@using Koogle.Application.DTOs @using Koogle.Application.Interfaces @using Koogle.Domain.Interfaces @using System.ComponentModel.DataAnnotations @inject IClubService ClubService @inject IUserService UserService @inject IEmailService EmailService @inject NavigationManager NavigationManager @inject ISnackbar Snackbar @if (_isSending) { } Abbrechen @if (_isSending) { } Einladung senden @code { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public Guid ClubId { get; set; } [Parameter] public string ClubName { get; set; } = ""; private MudForm _form = null!; private string _email = ""; private bool _isValid; private bool _isSending; private void Cancel() => MudDialog.Cancel(); private async Task Send() { await _form.Validate(); if (!_isValid) return; _isSending = true; StateHasChanged(); try { var currentUser = await UserService.GetCurrentUserAsync(); if (currentUser is null) { Snackbar.Add("Nicht angemeldet", Severity.Error); return; } // Create invitation with 7 days expiry var dto = new CreateClubInvitationDto { ClubId = ClubId, ExpiresAt = DateTime.UtcNow.AddDays(7), MaxUses = 1 }; var invitation = await ClubService.CreateInvitationAsync(dto, currentUser.ProfileId); // Build invite URL var baseUrl = NavigationManager.BaseUri.TrimEnd('/'); var inviteUrl = $"{baseUrl}/club/join/{invitation.Token}"; // Send email var sent = await EmailService.SendClubInvitationEmailAsync(_email, inviteUrl, ClubName, ClubId); if (sent) { Snackbar.Add($"Einladung an {_email} gesendet", Severity.Success); MudDialog.Close(DialogResult.Ok(true)); } else { Snackbar.Add("E-Mail konnte nicht gesendet werden", Severity.Error); } } catch (Exception ex) { Snackbar.Add($"Fehler: {ex.Message}", Severity.Error); } finally { _isSending = false; StateHasChanged(); } } }