diff --git a/src/apps/blazor/client/Components/ApiHelper.cs b/src/apps/blazor/client/Components/ApiHelper.cs index 2e7de184a..8c6522a46 100644 --- a/src/apps/blazor/client/Components/ApiHelper.cs +++ b/src/apps/blazor/client/Components/ApiHelper.cs @@ -1,4 +1,5 @@ using FSH.Starter.Blazor.Infrastructure.Api; +using Microsoft.AspNetCore.Components; using MudBlazor; namespace FSH.Starter.Blazor.Client.Components; @@ -8,6 +9,7 @@ public static class ApiHelper public static async Task ExecuteCallGuardedAsync( Func> call, ISnackbar snackbar, + NavigationManager navigationManager, FshValidation? customValidation = null, string? successMessage = null) { @@ -23,8 +25,12 @@ public static class ApiHelper return result; } - catch (Exception ex) + catch (ApiException ex) { + if (ex.StatusCode == 401) + { + navigationManager.NavigateTo("/logout"); + } var message = ex.Message switch { "TypeError: Failed to fetch" => "Unable to Reach API", @@ -61,4 +67,4 @@ public static async Task ExecuteCallGuardedAsync( return false; } -} \ No newline at end of file +} diff --git a/src/apps/blazor/client/Components/Dialogs/Logout.razor b/src/apps/blazor/client/Components/Dialogs/Logout.razor index b87832d88..202ac8717 100644 --- a/src/apps/blazor/client/Components/Dialogs/Logout.razor +++ b/src/apps/blazor/client/Components/Dialogs/Logout.razor @@ -30,8 +30,7 @@ async Task Submit() { - await AuthService.LogoutAsync(); - Toast.Add("Logged out", Severity.Warning); + Navigation.NavigateTo("/logout"); MudDialog.Close(DialogResult.Ok(true)); } diff --git a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs b/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs index 6e6c46e99..fe7bd405c 100644 --- a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs +++ b/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs @@ -97,7 +97,7 @@ private async Task LocalLoadDataAsync() Loading = true; if (await ApiHelper.ExecuteCallGuardedAsync( - () => Context.ClientContext.LoadDataFunc(), Toast) + () => Context.ClientContext.LoadDataFunc(), Toast, Navigation) is List result) { _entityList = result; @@ -144,7 +144,7 @@ private async Task> ServerReload(TableState state, Cancellati var filter = GetPaginationFilter(state); if (await ApiHelper.ExecuteCallGuardedAsync( - () => Context.ServerContext.SearchFunc(filter), Toast) + () => Context.ServerContext.SearchFunc(filter), Toast, Navigation) is { } result) { _totalItems = result.TotalCount; @@ -213,7 +213,7 @@ private async Task InvokeModal(TEntity? entity = default) requestModel = Context.GetDefaultsFunc is not null && await ApiHelper.ExecuteCallGuardedAsync( - () => Context.GetDefaultsFunc(), Toast) + () => Context.GetDefaultsFunc(), Toast, Navigation) is { } defaultsResult ? defaultsResult : new TRequest(); @@ -234,7 +234,7 @@ Context.GetDefaultsFunc is not null Context.GetDetailsFunc is not null && await ApiHelper.ExecuteCallGuardedAsync( () => Context.GetDetailsFunc(id!), - Toast) + Toast, Navigation) is { } detailsResult ? detailsResult : entity!.Adapt(); diff --git a/src/apps/blazor/client/Pages/Auth/Logout.razor b/src/apps/blazor/client/Pages/Auth/Logout.razor new file mode 100644 index 000000000..c02ac1597 --- /dev/null +++ b/src/apps/blazor/client/Pages/Auth/Logout.razor @@ -0,0 +1,11 @@ +@page "/logout" +@attribute [AllowAnonymous] +@inject IAuthenticationService AuthService + +@code{ + protected override async Task OnInitializedAsync() + { + await AuthService.LogoutAsync(); + Toast.Add("Logged out", Severity.Error); + } +} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs b/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs index 148f314a1..a07f88bc4 100644 --- a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs +++ b/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs @@ -27,7 +27,7 @@ private async Task SubmitAsync() var response = await ApiHelper.ExecuteCallGuardedAsync( () => UsersClient.SelfRegisterUserEndpointAsync(Tenant, _createUserRequest), - Toast, + Toast, Navigation, _customValidation); if (response != null) diff --git a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs b/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs index f9564067c..103acf4e6 100644 --- a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs +++ b/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs @@ -42,7 +42,7 @@ protected override async Task OnInitializedAsync() _canSearchRoleClaims = await AuthService.HasPermissionAsync(state.User, FshAction.View, FshResource.RoleClaims); if (await ApiHelper.ExecuteCallGuardedAsync( - () => RolesClient.GetRolePermissionsEndpointAsync(Id), Toast) + () => RolesClient.GetRolePermissionsEndpointAsync(Id), Toast, Navigation) is RoleDto role && role.Permissions is not null) { _title = string.Format("{0} Permissions", role.Name); diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs index 869ae0983..953eeb1d4 100644 --- a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs +++ b/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs @@ -48,7 +48,7 @@ private async Task ToggleUserStatus() protected override async Task OnInitializedAsync() { if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserEndpointAsync(Id!), Toast) + () => UsersClient.GetUserEndpointAsync(Id!), Toast, Navigation) is UserDetail user) { _firstName = user.FirstName; diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs index a2ed8a912..a973ba16f 100644 --- a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs +++ b/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs @@ -38,14 +38,14 @@ protected override async Task OnInitializedAsync() _canSearchRoles = await AuthService.HasPermissionAsync(state.User, FshAction.View, FshResource.UserRoles); if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserEndpointAsync(Id!), Toast) + () => UsersClient.GetUserEndpointAsync(Id!), Toast, Navigation) is UserDetail user) { _title = $"{user.FirstName} {user.LastName}'s Roles"; _description = string.Format("Manage {0} {1}'s Roles", user.FirstName, user.LastName); if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserRolesEndpointAsync(user.Id.ToString()), Toast) + () => UsersClient.GetUserRolesEndpointAsync(user.Id.ToString()), Toast, Navigation) is ICollection response) { _userRolesList = response.ToList(); diff --git a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs b/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs index b0bbeca78..5492f6fd1 100644 --- a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs +++ b/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs @@ -94,7 +94,7 @@ private async Task DeactivateTenantAsync(string id) { if (await ApiHelper.ExecuteCallGuardedAsync( () => ApiClient.DisableTenantEndpointAsync(id), - Toast, + Toast, Navigation, null, "Tenant Deactivated.") is not null) { @@ -106,7 +106,7 @@ private async Task ActivateTenantAsync(string id) { if (await ApiHelper.ExecuteCallGuardedAsync( () => ApiClient.ActivateTenantEndpointAsync(id), - Toast, + Toast, Navigation, null, "Tenant Activated.") is not null) { diff --git a/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor b/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor index b72a8a9fd..2b9b2bf4a 100644 --- a/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor +++ b/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor @@ -42,7 +42,7 @@ Request.ExtendedExpiryDate = date.HasValue ? date.Value : Request.ExtendedExpiryDate; if (await ApiHelper.ExecuteCallGuardedAsync( () => TenantsClient.UpgradeSubscriptionEndpointAsync(Request), - Toast, + Toast, Navigation, null, "Upgraded Subscription.") is not null) {