From 4171a3138b57832f2ed44eeb66ee726e9ee87f30 Mon Sep 17 00:00:00 2001 From: TekH Date: Thu, 11 Jun 2026 10:09:59 +0200 Subject: [PATCH] Add LoginSender.razor for Sender user authentication Implemented a new `LoginSender.razor` component to provide a login page for "Sender" users. The page includes: - A responsive card layout with a header, input fields for "Username" and "Password," and a submit button with a loading spinner. - Error handling for invalid credentials and server errors, with appropriate alerts. - A password visibility toggle for better user experience. - Integration with `AuthService` for authentication and `NavigationManager` for redirection. Added Blazor code-behind logic to manage state, handle login submission, and trigger login on "Enter" key press. The page is styled with a custom theme and includes a footer for support information. --- .../Pages/LoginSender.razor | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 EnvelopeGenerator.ReceiverUI/Pages/LoginSender.razor diff --git a/EnvelopeGenerator.ReceiverUI/Pages/LoginSender.razor b/EnvelopeGenerator.ReceiverUI/Pages/LoginSender.razor new file mode 100644 index 00000000..b1536d0d --- /dev/null +++ b/EnvelopeGenerator.ReceiverUI/Pages/LoginSender.razor @@ -0,0 +1,172 @@ +@page "/login" +@using EnvelopeGenerator.ReceiverUI.Services +@inject AuthService AuthService +@inject NavigationManager Navigation + + + +
+ +
+ +@code { + string Username = string.Empty; + string Password = string.Empty; + bool ShowPassword; + bool IsLoading; + SenderLoginResult? LoginResult; + + async Task OnKeyDownAsync(Microsoft.AspNetCore.Components.Web.KeyboardEventArgs e) { + if (e.Key == "Enter") + await SubmitAsync(); + } + + async Task SubmitAsync() { + if (string.IsNullOrWhiteSpace(Username) || string.IsNullOrWhiteSpace(Password) || IsLoading) return; + + IsLoading = true; + LoginResult = null; + await InvokeAsync(StateHasChanged); + + var result = await AuthService.LoginSenderAsync(Username.Trim(), Password.Trim()); + + if (result == SenderLoginResult.Success) { + Navigation.NavigateTo("/", forceLoad: true); + return; + } + + LoginResult = result; + IsLoading = false; + await InvokeAsync(StateHasChanged); + } +} +