This commit is contained in:
Daniel Balk 2023-04-12 18:01:18 +02:00
parent 6e4a269c35
commit ecaab3a755
5 changed files with 128 additions and 28 deletions

View file

@ -0,0 +1,27 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.App.Models.Forms;
public class UserDataModel
{
[Required]
public string FirstName { get; set; } = "";
[Required]
public string LastName { get; set; } = "";
[Required]
public string Email { get; set; } = "";
[Required]
public string Address { get; set; } = "";
[Required]
public string City { get; set; } = "";
[Required]
public string State { get; set; } = "";
[Required]
public string Country { get; set; } = "";
}

View file

@ -0,0 +1,21 @@
using System.ComponentModel.DataAnnotations;
namespace Moonlight.App.Models.Forms;
public class UserRegisterModel
{
[Required, EmailAddress]
public string Email { get; set; }
[Required, MinLength(3)]
public string FirstName { get; set; }
[Required, MinLength(3)]
public string LastName { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string ConfirmPassword { get; set; }
}

View file

@ -7,11 +7,17 @@
@using Moonlight.App.Services
@using Moonlight.App.Services.OAuth2
@using Moonlight.App.Models.Forms
@using Moonlight.App.Services.Interop
@using Moonlight.App.Services.Sessions
@inject SmartTranslateService SmartTranslateService
@inject GoogleOAuth2Service GoogleOAuth2Service
@inject NavigationManager NavigationManager
@inject DiscordOAuth2Service DiscordOAuth2Service
@inject AlertService AlertService
@inject UserService UserService
@inject CookieService CookieService
<div class="d-flex flex-center">
<div class="card rounded-3 w-md-550px">
@ -46,38 +52,44 @@
</div>
</div>
<div class="separator separator-content my-14">
<div class="separator separator-content my-10">
<span class="w-125px text-gray-500 fw-semibold fs-7">
<TL>Or with email</TL>
</span>
</div>
<SmartForm Model="UserRegisterModel" OnValidSubmit="CreateUser">
<div class="fv-row mb-4 fv-plugins-icon-container">
<InputText @bind-Value="UserRegisterModel.Email" placeholder="@(SmartTranslateService.Translate("Email"))" name="email" autocomplete="off" class="form-control bg-transparent" />
</div>
<div class="row">
<div class="col-lg-6 mb-4 fv-plugins-icon-container">
<InputText @bind-Value="UserRegisterModel.FirstName" type="text" placeholder="@(SmartTranslateService.Translate("Firstname"))" name="text" class="form-control bg-transparent" />
</div>
<div class="fv-row mb-8 fv-plugins-icon-container">
<input type="text" placeholder="@(SmartTranslateService.Translate("Firstname"))" name="text" class="form-control bg-transparent">
</div>
<div class="col-lg-6 mb-4 fv-plugins-icon-container">
<InputText @bind-Value="UserRegisterModel.LastName" type="text" placeholder="@(SmartTranslateService.Translate("Lastname"))" name="text"class="form-control bg-transparent" />
</div>
</div>
<div class="fv-row mb-8 fv-plugins-icon-container">
<input type="text" placeholder="@(SmartTranslateService.Translate("Lastname"))" name="text"class="form-control bg-transparent">
</div>
<div class="fv-row mb-8 fv-plugins-icon-container">
<input type="text" placeholder="@(SmartTranslateService.Translate("Email"))" name="email" autocomplete="off" class="form-control bg-transparent">
</div>
<div class="fv-row mb-3 fv-plugins-icon-container">
<input type="password" placeholder="@(SmartTranslateService.Translate("Password"))" name="password" autocomplete="off" class="form-control bg-transparent">
</div>
<div class="fv-row mb-5 fv-plugins-icon-container">
<input type="password" placeholder="@(SmartTranslateService.Translate("Repeat password"))" name="password" autocomplete="off" class="form-control bg-transparent">
</div>
<div class="d-grid mb-10">
<button class="btn btn-primary">
<TL>Sign-up</TL>
</button>
</div>
<div class="row">
<div class="col-lg-6 mb-4 fv-plugins-icon-container">
<InputText @bind-Value="UserRegisterModel.Password" type="password" placeholder="@(SmartTranslateService.Translate("Password"))" name="password" autocomplete="off" class="form-control bg-transparent" />
</div>
<div class="col-lg-6 mb-4 fv-plugins-icon-container">
<InputText @bind-Value="UserRegisterModel.ConfirmPassword" type="password" placeholder="@(SmartTranslateService.Translate("Repeat password"))" name="password" autocomplete="off" class="form-control bg-transparent" />
</div>
</div>
<div class="d-grid mb-6">
<button type="submit" class="btn btn-primary">
<TL>Sign-up</TL>
</button>
</div>
</SmartForm>
<div class="text-gray-500 text-center fw-semibold fs-6">
<TL>Already registered?</TL>
@ -93,6 +105,8 @@
@code
{
private UserRegisterModel UserRegisterModel = new();
private async Task DoGoogle()
{
var url = await GoogleOAuth2Service.GetUrl();
@ -104,4 +118,21 @@
var url = await DiscordOAuth2Service.GetUrl();
NavigationManager.NavigateTo(url, true);
}
private async Task CreateUser()
{
if (UserRegisterModel.ConfirmPassword != UserRegisterModel.Password)
{
await AlertService.Error(SmartTranslateService.Translate("Passwords need to match"));
return;
}
var token = await UserService.Register(UserRegisterModel.Email, UserRegisterModel.Password, UserRegisterModel.FirstName, UserRegisterModel.LastName);
await CookieService.SetValue("token", token, 10);
if (NavigationManager.Uri.EndsWith("register"))
NavigationManager.NavigateTo("/", true);
else
NavigationManager.NavigateTo(NavigationManager.Uri, true);
}
}

View file

@ -3,7 +3,9 @@
@using Moonlight.Shared.Components.Navigations
@using Moonlight.App.Services.Sessions
@using Moonlight.App.Database.Entities
@using Moonlight.App.Models.Forms
@using Moonlight.App.Repositories
@using Moonlight.Shared.Components.Auth
@inject IdentityService IdentityService
@inject UserRepository UserRepository
@ -74,17 +76,32 @@
@code
{
private User User = new User();
private UserDataModel User = new UserDataModel();
private User CurrentUser;
private async Task Load(LazyLoader loader)
{
User = await IdentityService.Get();
CurrentUser = await IdentityService.Get();
User.FirstName = CurrentUser.FirstName;
User.LastName = CurrentUser.LastName;
User.Email = CurrentUser.Email;
User.Address = CurrentUser.Address;
User.City = CurrentUser.City;
User.State = CurrentUser.State;
User.Country = CurrentUser.Country;
}
private Task Save()
{
UserRepository.Update(User);
CurrentUser.FirstName = User.FirstName;
CurrentUser.LastName = User.LastName;
CurrentUser.Email = User.Email;
CurrentUser.Address = User.Address;
CurrentUser.City = User.City;
CurrentUser.State = User.State;
CurrentUser.Country = User.Country;
UserRepository.Update(CurrentUser);
return Task.CompletedTask;
}

View file

@ -536,3 +536,7 @@ Configure your domain;Configure your domain
You reached the maximum amount of domains in your subscription;You reached the maximum amount of domains in your subscription
You need to specify a shared domain;You need to specify a shared domain
A domain with this name does already exist for this shared domain;A domain with this name does already exist for this shared domain
The Email field is required.;The Email field is required.
The Password field is required.;The Password field is required.
The ConfirmPassword field is required.;The ConfirmPassword field is required.
Passwords need to match;Passwords need to match