diff --git a/Wave/Components/Account/Pages/Register.razor b/Wave/Components/Account/Pages/Register.razor index 00eeac9..bd87149 100644 --- a/Wave/Components/Account/Pages/Register.razor +++ b/Wave/Components/Account/Pages/Register.razor @@ -5,8 +5,10 @@ @using System.Text.Encodings.Web @using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.WebUtilities +@using Microsoft.Extensions.Options @using Wave.Data +@inject IOptions Features @inject UserManager UserManager @inject IUserStore UserStore @inject SignInManager SignInManager @@ -25,125 +27,123 @@ @Localizer["Title"] -
-
-

@Localizer["Title"]

- - - - - - - - - - - + + + @if (Features.Value.NativeSignup) { + + - - -
- -
+ + + + + + + + + + + + + } else { + +

@Localizer["SignupDisabled_Message"]

+
+ } + + @code { - private IEnumerable? _identityErrors; + private IEnumerable? _identityErrors; - [SupplyParameterFromForm] - private InputModel Input { get; set; } = new(); + [SupplyParameterFromForm] + private InputModel Input { get; set; } = new(); - [SupplyParameterFromQuery] - private string? ReturnUrl { get; set; } + [SupplyParameterFromQuery] + private string? ReturnUrl { get; set; } - private string? Message => - _identityErrors is null ? null : - $"Error: {string.Join(", ", _identityErrors.Select(error => error.Description))}"; + private string? Message => + _identityErrors is null ? null : + $"Error: {string.Join(", ", _identityErrors.Select(error => error.Description))}"; - public async Task RegisterUser(EditContext editContext) { - var user = CreateUser(); + public async Task RegisterUser(EditContext editContext) { + if (Features.Value.NativeSignup is false) return; + var user = CreateUser(); - await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); - var emailStore = GetEmailStore(); - await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); - var result = await UserManager.CreateAsync(user, Input.Password); + await UserStore.SetUserNameAsync(user, Input.Email, CancellationToken.None); + var emailStore = GetEmailStore(); + await emailStore.SetEmailAsync(user, Input.Email, CancellationToken.None); + var result = await UserManager.CreateAsync(user, Input.Password); - if (!result.Succeeded) { - _identityErrors = result.Errors; - return; - } + if (!result.Succeeded) { + _identityErrors = result.Errors; + return; + } - Logger.LogInformation("User created a new account with password."); + Logger.LogInformation("User created a new account with password."); - var userId = await UserManager.GetUserIdAsync(user); - var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); - code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); - var callbackUrl = NavigationManager.GetUriWithQueryParameters( - NavigationManager.ToAbsoluteUri("Account/ConfirmEmail").AbsoluteUri, - new Dictionary { ["userId"] = userId, ["code"] = code, ["returnUrl"] = ReturnUrl }); + var userId = await UserManager.GetUserIdAsync(user); + var code = await UserManager.GenerateEmailConfirmationTokenAsync(user); + code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); + var callbackUrl = NavigationManager.GetUriWithQueryParameters( + NavigationManager.ToAbsoluteUri("Account/ConfirmEmail").AbsoluteUri, + new Dictionary { ["userId"] = userId, ["code"] = code, ["returnUrl"] = ReturnUrl }); - await EmailSender.SendConfirmationLinkAsync(user, Input.Email, HtmlEncoder.Default.Encode(callbackUrl)); + await EmailSender.SendConfirmationLinkAsync(user, Input.Email, HtmlEncoder.Default.Encode(callbackUrl)); - if (UserManager.Options.SignIn.RequireConfirmedAccount) { - RedirectManager.RedirectTo( - "Account/RegisterConfirmation", - new() { ["email"] = Input.Email, ["returnUrl"] = ReturnUrl }); - } + if (UserManager.Options.SignIn.RequireConfirmedAccount) { + RedirectManager.RedirectTo( + "Account/RegisterConfirmation", + new() { ["email"] = Input.Email, ["returnUrl"] = ReturnUrl }); + } - await SignInManager.SignInAsync(user, isPersistent: false); - RedirectManager.RedirectTo(ReturnUrl); - } + await SignInManager.SignInAsync(user, isPersistent: false); + RedirectManager.RedirectTo(ReturnUrl); + } - private ApplicationUser CreateUser() { - try { - return Activator.CreateInstance(); - } catch { - throw new InvalidOperationException( - $"Can't create an instance of '{nameof(ApplicationUser)}'. " + - $"Ensure that '{nameof(ApplicationUser)}' is not an abstract class and has a parameterless constructor."); - } - } + private ApplicationUser CreateUser() { + try { + return Activator.CreateInstance(); + } catch { + throw new InvalidOperationException( + $"Can't create an instance of '{nameof(ApplicationUser)}'. " + + $"Ensure that '{nameof(ApplicationUser)}' is not an abstract class and has a parameterless constructor."); + } + } - private IUserEmailStore GetEmailStore() { - if (!UserManager.SupportsUserEmail) { - throw new NotSupportedException("The default UI requires a user store with email support."); - } + private IUserEmailStore GetEmailStore() { + if (!UserManager.SupportsUserEmail) { + throw new NotSupportedException("The default UI requires a user store with email support."); + } - return (IUserEmailStore)UserStore; - } + return (IUserEmailStore)UserStore; + } - private sealed class InputModel { - [Required] - [EmailAddress] - [Display(Name = "Email")] - public string Email { get; set; } = ""; + private sealed class InputModel { + [Required] + [EmailAddress] + [Display(Name = "Email")] + public string Email { get; set; } = ""; - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } = ""; + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string Password { get; set; } = ""; - [DataType(DataType.Password)] - [Display(Name = "Confirm password")] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string ConfirmPassword { get; set; } = ""; - } + [DataType(DataType.Password)] + [Display(Name = "Confirm password")] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } = ""; + } } diff --git a/Wave/Components/Alert.razor b/Wave/Components/Alert.razor index 356619c..c76cc2c 100644 --- a/Wave/Components/Alert.razor +++ b/Wave/Components/Alert.razor @@ -1,5 +1,5 @@ @using System.Globalization -