diff --git a/TaikoWebUI/Pages/Login.razor b/TaikoWebUI/Pages/Login.razor index 741d27b..37ad2b8 100644 --- a/TaikoWebUI/Pages/Login.razor +++ b/TaikoWebUI/Pages/Login.razor @@ -3,11 +3,13 @@ @inject AuthService AuthService @inject NavigationManager NavigationManager @inject BreadcrumbsStateContainer BreadcrumbsStateContainer +@inject IKeyInterceptorFactory KeyInterceptorFactory @page "/Login" +@using MudBlazor.Services -@if (!AuthService.IsLoggedIn) +@if (!AuthService.IsLoggedIn) { // Not logged in, show login form @@ -21,13 +23,14 @@
+ FullWidth="true" Required="@true" OnKeyUp="HandleKeyDown" + RequiredError="Access code is required" + Label=@Localizer["Access Code"] Variant="Variant.Outlined" Margin="Margin.Dense" /> - @Localizer["Log In"] + T="string" FullWidth="true" Required="@true" OnKeyUp="HandleKeyDown" + RequiredError="Password is required" + Label=@Localizer["Password"] Variant="Variant.Outlined" Margin="Margin.Dense" /> + @Localizer["Log In"]
@@ -35,7 +38,8 @@
-} else +} +else { // Already logged in, redirect to Dashboard NavigationManager.NavigateTo("/"); diff --git a/TaikoWebUI/Pages/Login.razor.cs b/TaikoWebUI/Pages/Login.razor.cs index be4cdaf..5ed7866 100644 --- a/TaikoWebUI/Pages/Login.razor.cs +++ b/TaikoWebUI/Pages/Login.razor.cs @@ -1,15 +1,19 @@ -namespace TaikoWebUI.Pages; +using MudBlazor.Services; +using static MudBlazor.CategoryTypes; + +namespace TaikoWebUI.Pages; public partial class Login { private string inputAccessCode = ""; private MudForm loginForm = default!; private string inputPassword = ""; + bool debounce = false; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); - + if (AuthService.LoginRequired && !AuthService.IsLoggedIn) { await AuthService.LoginWithAuthToken(); @@ -22,6 +26,7 @@ public partial class Login private async Task OnLogin() { + debounce = true; var result = await AuthService.Login(inputAccessCode, inputPassword); var options = new DialogOptions { DisableBackdropClick = true }; switch (result) @@ -66,4 +71,27 @@ public partial class Login break; } } + + internal void HandleKeyDown(KeyboardEventArgs args) + { + if (debounce) { debounce = !debounce; return; } + switch (args.Key) + { + case "Enter": + _ = Submit(); + break; + } + } + + private async Task Submit() + { + if (loginForm != null) + { + await loginForm.Validate(); + if (loginForm.IsValid) + { + await OnLogin(); + } + } + } } \ No newline at end of file diff --git a/TaikoWebUI/Pages/Register.razor b/TaikoWebUI/Pages/Register.razor index 01e4d3c..5a45835 100644 --- a/TaikoWebUI/Pages/Register.razor +++ b/TaikoWebUI/Pages/Register.razor @@ -12,8 +12,8 @@ } else if (AuthService.IsLoggedIn) { - // User is already logged in. Redirect to dashboard. - NavigationManager.NavigateTo("/"); + // User is already logged in. Redirect to dashboard. + NavigationManager.NavigateTo("/"); } else { @@ -27,28 +27,29 @@ else
- - @if (AuthService.RegisterWithLastPlayTime) - { - - - - } - - - - - @Localizer["Register"] -
+ + @if (AuthService.RegisterWithLastPlayTime) + { + + + + } + + + + + @Localizer["Register"] +
diff --git a/TaikoWebUI/Pages/Register.razor.cs b/TaikoWebUI/Pages/Register.razor.cs index 68027fa..7284ed3 100644 --- a/TaikoWebUI/Pages/Register.razor.cs +++ b/TaikoWebUI/Pages/Register.razor.cs @@ -1,10 +1,19 @@ -namespace TaikoWebUI.Pages; +using System.ComponentModel.DataAnnotations; + +namespace TaikoWebUI.Pages; public partial class Register { - private string accessCode = ""; - private string confirmPassword = ""; - private string password = ""; + [Required] + private string AccessCode { get; set; } = ""; + + [Required] + private string Password { get; set; } = ""; + + [Required] + [Compare(nameof(Password))] + private string ConfirmPassword { get; set; } = ""; + private MudForm registerForm = default!; private MudDatePicker datePicker = new(); @@ -12,6 +21,7 @@ public partial class Register private DateTime? date = DateTime.Today; private TimeSpan? time = new TimeSpan(00, 45, 00); private string inviteCode = ""; + bool debounce = false; protected override async Task OnInitializedAsync() { @@ -24,8 +34,9 @@ public partial class Register private async Task OnRegister() { + debounce = true; var inputDateTime = date!.Value.Date + time!.Value; - var result = await AuthService.Register(accessCode, inputDateTime, password, confirmPassword, inviteCode); + var result = await AuthService.Register(AccessCode, inputDateTime, Password, ConfirmPassword, inviteCode); var options = new DialogOptions { DisableBackdropClick = true }; switch (result) { @@ -71,7 +82,7 @@ public partial class Register await DialogService.ShowMessageBox( Localizer["Error"], (MarkupString) - (string) Localizer["Register Wrong Last Play Time Error"], + (string)Localizer["Register Wrong Last Play Time Error"], Localizer["Dialog OK"], null, null, options); break; case 6: @@ -82,4 +93,27 @@ public partial class Register break; } } + + internal void HandleKeyDown(KeyboardEventArgs args) + { + if (debounce) { debounce = !debounce; return; } + switch (args.Key) + { + case "Enter": + _ = Submit(); + break; + } + } + + private async Task Submit() + { + if (registerForm != null) + { + await registerForm.Validate(); + if (registerForm.IsValid) + { + await OnRegister(); + } + } + } } \ No newline at end of file