@page "/login" @layout Layout.EmptyLayout @rendermode @(new InteractiveServerRenderMode(prerender: false)) @attribute [Microsoft.AspNetCore.Authorization.AllowAnonymous] @inject NavigationManager Navigation @inject AuthenticationStateProvider AuthStateProvider @inject MenuAuthorizationService MenuAuthorization @inject IJSRuntime JS @AppLocalization.Text("common.signIn", "Sign In") - Taskify

@AppLocalization.Text("common.signIn", "Sign In") - Taskify

@AppLocalization.PageDescription("dashboard", "Continue to your work dashboard.")

@if (ShowUnavailableError) {

@AppLocalization.Text("result.apiUnavailable", "Unable to reach the API server. Start TaskTrackingSystem.WebApi and try again.")

} else if (ShowError) {

@ResultMessages.InvalidCredentials

} @if (ShowLoggedOutMessage) {

@AppLocalization.Text("result.signedOut", "You have been signed out successfully.")

} else if (ShowResetMessage) {

@AppLocalization.Text("result.passwordUpdated", "Password updated successfully. Please sign in with your new password.")

}

@AppLocalization.Text("auth.needAccount", "Need an account?") @AppLocalization.Text("auth.register", "Register")

@AppLocalization.Text("auth.resetPassword", "Reset password")

@code { [SupplyParameterFromQuery] private string? ReturnUrl { get; set; } [SupplyParameterFromQuery(Name = "error")] private string? Error { get; set; } [SupplyParameterFromQuery(Name = "loggedOut")] private string? LoggedOut { get; set; } [SupplyParameterFromQuery(Name = "reset")] private string? Reset { get; set; } private bool ShowError => string.Equals(Error, "invalid", StringComparison.OrdinalIgnoreCase); private bool ShowUnavailableError => string.Equals(Error, "unavailable", StringComparison.OrdinalIgnoreCase); private bool ShowLoggedOutMessage => string.Equals(LoggedOut, "true", StringComparison.OrdinalIgnoreCase); private bool ShowResetMessage => string.Equals(Reset, "true", StringComparison.OrdinalIgnoreCase); protected override async Task OnAfterRenderAsync(bool firstRender) { await JS.InvokeVoidAsync("initIcons"); if (firstRender) { var authState = await AuthStateProvider.GetAuthenticationStateAsync(); if (authState.User.Identity?.IsAuthenticated == true) { Navigation.NavigateTo(await ResolveLandingPageAsync(authState.User), forceLoad: true); } } } private bool showPassword = false; private async Task TogglePassword() { showPassword = !showPassword; await JS.InvokeVoidAsync("initIcons"); } private async Task ResolveLandingPageAsync(System.Security.Claims.ClaimsPrincipal user) { try { var menus = await MenuAuthorization.GetUserMenusAsync(user); var landing = FindFirstDashboardMenu(menus); if (!string.IsNullOrWhiteSpace(landing)) { return landing; } } catch { } return "/dashboard"; } private static string? FindFirstDashboardMenu(IEnumerable menus) { foreach (var menu in menus) { var found = FindFirstDashboardMenu(menu); if (!string.IsNullOrWhiteSpace(found)) { return found; } } return null; } private static string? FindFirstDashboardMenu(TaskTrackingSystem.Shared.Models.Menu.MenuDto menu) { if (!string.IsNullOrWhiteSpace(menu.MenuUrl) && menu.MenuUrl.StartsWith("/dashboard", StringComparison.OrdinalIgnoreCase)) { return menu.MenuUrl; } foreach (var subMenu in menu.SubMenus) { var found = FindFirstDashboardMenu(subMenu); if (!string.IsNullOrWhiteSpace(found)) { return found; } } return null; } }