106 lines
4.0 KiB
Plaintext
106 lines
4.0 KiB
Plaintext
@page "/register"
|
|
@using HopFrame.Security.Services
|
|
@using HopFrame.Web.Model
|
|
@using HopFrame.Web.Services
|
|
@using Microsoft.AspNetCore.Components.Forms
|
|
@using Microsoft.AspNetCore.Components.Routing
|
|
@using Microsoft.AspNetCore.Components.Web
|
|
|
|
@implements IDisposable
|
|
|
|
<PageTitle>Register</PageTitle>
|
|
|
|
<div class="register-wrapper">
|
|
<EditForm EditContext="_context" OnValidSubmit="OnRegister" FormName="register-form">
|
|
@*<AntiforgeryToken />*@
|
|
<div class="field-wrapper">
|
|
<h2>Register</h2>
|
|
<div class="mb-3">
|
|
<label for="email" class="form-label">Email address</label>
|
|
<InputText type="email" class="form-control" id="email" required @bind-Value="RegisterData.Email"/>
|
|
<ValidationMessage For="() => RegisterData.Email"/>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="username" class="form-label">Username</label>
|
|
<InputText type="text" class="form-control" id="username" required @bind-Value="RegisterData.Username"/>
|
|
<ValidationMessage For="() => RegisterData.Username"/>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="password" class="form-label">Password</label>
|
|
<InputText type="password" class="form-control" id="password" aria-describedby="passwordHelp" required @bind-Value="RegisterData.Password"/>
|
|
<div id="passwordHelp" class="form-text">The password needs to be at least 8 characters long</div>
|
|
<ValidationMessage For="() => RegisterData.Password"/>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="passwordRepeat" class="form-label">Repeat password</label>
|
|
<InputText type="password" class="form-control" id="passwordRepeat" aria-describedby="passwordHelp" required @bind-Value="RegisterData.RepeatedPassword"/>
|
|
<ValidationMessage For="() => RegisterData.RepeatedPassword"/>
|
|
</div>
|
|
<div class="mb-3">
|
|
<span>Already have an account? <NavLink href="login">Login</NavLink></span>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary">Register</button>
|
|
</div>
|
|
</EditForm>
|
|
</div>
|
|
|
|
@inject NavigationManager Navigator
|
|
@inject IUserService Users
|
|
@inject IAuthService Auth
|
|
|
|
@code {
|
|
public static string RedirectAfterRegister { get; set; } = "/";
|
|
|
|
[SupplyParameterFromForm]
|
|
private RegisterData RegisterData { get; set; }
|
|
|
|
private EditContext _context;
|
|
private ValidationMessageStore _messages;
|
|
|
|
protected override void OnInitialized() {
|
|
RegisterData ??= new();
|
|
|
|
_context = new EditContext(RegisterData);
|
|
_context.OnValidationRequested += ValidateForm;
|
|
_messages = new ValidationMessageStore(_context);
|
|
}
|
|
|
|
private async Task OnRegister() {
|
|
var hasConflict = false;
|
|
|
|
if (await Users.GetUserByEmail(RegisterData.Email) is not null) {
|
|
_messages.Add(() => RegisterData.Email, "Email is already in use");
|
|
hasConflict = true;
|
|
}
|
|
|
|
if (await Users.GetUserByUsername(RegisterData.Username) is not null) {
|
|
_messages.Add(() => RegisterData.Username, "Username is already in use");
|
|
hasConflict = true;
|
|
}
|
|
|
|
if (hasConflict) return;
|
|
|
|
await Auth.Register(RegisterData);
|
|
Navigator.NavigateTo(RedirectAfterRegister, true);
|
|
}
|
|
|
|
private void ValidateForm(object sender, ValidationRequestedEventArgs e) {
|
|
_messages.Clear();
|
|
|
|
if (!RegisterData.PasswordsMatch) {
|
|
_messages.Add(() => RegisterData.RepeatedPassword, "Passwords doesn't mach");
|
|
}
|
|
|
|
if (!RegisterData.PasswordIsValid) {
|
|
_messages.Add(() => RegisterData.Password, "Password needs to be at least 8 characters long");
|
|
}
|
|
|
|
if (!RegisterData.EmailIsValid) {
|
|
_messages.Add(() => RegisterData.Email, "Please enter a valid email address");
|
|
}
|
|
}
|
|
|
|
public void Dispose() {
|
|
_context.OnValidationRequested -= ValidateForm;
|
|
}
|
|
} |