diff --git a/TIAM.Services/SignalRTags.cs b/TIAM.Services/SignalRTags.cs index 7d95d595..4770865b 100644 --- a/TIAM.Services/SignalRTags.cs +++ b/TIAM.Services/SignalRTags.cs @@ -5,7 +5,7 @@ namespace TIAM.Services; public class SignalRTags : AcSignalRTags { - public const int GetSiteViewModelByUserId = 999; + public const int GetSiteViewModelByUserId = int.MaxValue; public const int GetTransfer = 1; public const int GetTransfers = 2; @@ -132,5 +132,8 @@ public class SignalRTags : AcSignalRTags public const int DriverUpdateTransfer = 151; public const int AuthenticateUser = 160; + public const int RefreshToken = 200; + + public const int GetAllLogItemsByFilterText = 1000; } diff --git a/TIAMSharedUI/Pages/AppLaunchComponent.razor b/TIAMSharedUI/Pages/AppLaunchComponent.razor index d96aa410..820d6cd3 100644 --- a/TIAMSharedUI/Pages/AppLaunchComponent.razor +++ b/TIAMSharedUI/Pages/AppLaunchComponent.razor @@ -11,6 +11,7 @@ @using AyCode.Interfaces.StorageHandlers; @using System.Globalization; @using AyCode.Core.Enums +@using AyCode.Core.Extensions @using AyCode.Core.Helpers @using AyCode.Core.Loggers @using AyCode.Services.Loggers @@ -104,7 +105,7 @@ else { _logger.Info("Couldn't refresh token"); - SignOut(); + await SignOut(); //NavManager.NavigateTo("/"); return; } @@ -210,14 +211,19 @@ return (userDetailsStr, locale); } - private void SignOut() + private async Task SignOut() { - var userBasicDetail = JsonConvert.DeserializeObject(userDetailsStr); + _logger.Info("SignOut called"); - UserDataService.Logout(userBasicDetail?.RefreshToken); - AuthStateProvider.GetAuthenticationStateAsync(); - SecureStorageHandler.ClearAllSecureStorageAsync(); + var userBasicDetail = userDetailsStr.JsonTo(); + + await AuthStateProvider.GetAuthenticationStateAsync(); + await SecureStorageHandler.ClearAllSecureStorageAsync(); + sessionService.ClearAll(); + ComponentUpdateService.CallRequestRefreshAll(); + + UserDataService.Logout(userBasicDetail?.RefreshToken).Forget(); } CultureInfo Culture diff --git a/TIAMSharedUI/Pages/Login.razor.cs b/TIAMSharedUI/Pages/Login.razor.cs index 0ce4884f..cb7676a5 100644 --- a/TIAMSharedUI/Pages/Login.razor.cs +++ b/TIAMSharedUI/Pages/Login.razor.cs @@ -94,23 +94,22 @@ namespace TIAMSharedUI.Pages } else { - string authResponseJson = mainResponse.Content.ToJson(); //JsonSerializer.Serialize(mainResponse.Content); + //var authResponseJson = mainResponse.Content.ToJson(); //JsonSerializer.Serialize(mainResponse.Content); + var authResponse = mainResponse.Content.ToJson().JsonTo(); //JsonSerializer.Deserialize(authResponseJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); - var authResponse = authResponseJson.JsonTo(); //JsonSerializer.Deserialize(authResponseJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); - - string accessToken = authResponse.AccessToken; + var accessToken = authResponse.AccessToken; var token = ProcessToken(accessToken); - string userId = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.NameId).Value; - string email = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.Email).Value; + var userId = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.NameId).Value; + var email = token.Claims.First(claim => claim.Type == JwtRegisteredClaimNames.Email).Value; var myId = Guid.Parse(userId); //userDataService.User.Email = _email; var userBasicDetails = new UserBasicDetails(userId, email, authResponse.AccessToken, authResponse.RefreshToken); - string userBasicDetailsJson = JsonSerializer.Serialize(userBasicDetails); + var userBasicDetailsJson = JsonSerializer.Serialize(userBasicDetails); //save to local storage @@ -193,9 +192,9 @@ namespace TIAMSharedUI.Pages public async Task CheckIfDriver(List Permissions) { - bool _isDriver = false; + var _isDriver = false; - foreach (UserProductMapping Permission in Permissions) + foreach (var Permission in Permissions) { //var permissionToCheck = await ServiceProviderDataService.GetUserProductMappingByIdAsync(Permission.Id); BrowserConsoleLogWriter.Debug($"calling IsPowerOf with values: {Permission.Id}, {Permission.Permissions}, {1}"); @@ -213,11 +212,11 @@ namespace TIAMSharedUI.Pages { BrowserConsoleLogWriter.Debug($"called IsBitSet with values: {number}, {power}"); - int powerOfTwo = 1 << power; // Calculate 2^power + var powerOfTwo = 1 << power; // Calculate 2^power BrowserConsoleLogWriter.Debug($"powerOfTwo: {powerOfTwo}, {power}"); - bool result = (number & powerOfTwo) != 0; // Check if the bit at position `power` is set + var result = (number & powerOfTwo) != 0; // Check if the bit at position `power` is set return result; } } diff --git a/TIAMSharedUI/Pages/User/Hotels/HotelAdmin.razor b/TIAMSharedUI/Pages/User/Hotels/HotelAdmin.razor index 8c5fff0f..80ba856a 100644 --- a/TIAMSharedUI/Pages/User/Hotels/HotelAdmin.razor +++ b/TIAMSharedUI/Pages/User/Hotels/HotelAdmin.razor @@ -1,4 +1,4 @@ -@page "/user/hoteladmin/{id:guid}" +@page "/user/hoteladmin/{Id:guid}" @using TIAMSharedUI.Shared @using TIAMWebApp.Shared.Application.Interfaces; @using TIAMSharedUI.Shared.Components.BaseComponents @@ -16,7 +16,7 @@
- +
@@ -25,24 +25,19 @@ @code { - [Parameter] public Guid id { get; set; } - bool isUserLoggedIn; - int userType = 0; + [Parameter] public Guid Id { get; set; } + bool _isUserLoggedIn; + int _userType = 0; protected override void OnInitialized() { //check if Id matches with userproductmapping - if (!_sessionService.IsAuthenticated) - { - return; - } - var check = _sessionService.User.UserModelDto.UserProductMappings.Any(x => x.ProductId == id); - if (!check) - { - return; - } - base.OnInitialized(); + if (!_sessionService.IsAuthenticated) return; + var check = _sessionService.User?.UserModelDto.UserProductMappings.Any(x => x.ProductId == Id) ?? false; + if (!check) return; + + base.OnInitialized(); } } diff --git a/TIAMSharedUI/Pages/User/Hotels/HotelComponent.razor.cs b/TIAMSharedUI/Pages/User/Hotels/HotelComponent.razor.cs index 0769277f..2f4e150e 100644 --- a/TIAMSharedUI/Pages/User/Hotels/HotelComponent.razor.cs +++ b/TIAMSharedUI/Pages/User/Hotels/HotelComponent.razor.cs @@ -15,6 +15,7 @@ using TIAMWebApp.Shared.Application.Models; using TIAMWebApp.Shared.Application.Models.ClientSide.UI; using TIAMWebApp.Shared.Application.Services; using TIAMWebApp.Shared.Application.Utility; +using System.Collections.Generic; namespace TIAMSharedUI.Pages.User.Hotels { @@ -148,7 +149,9 @@ namespace TIAMSharedUI.Pages.User.Hotels s.Phone }); - var productOwner = await AdminSignalRClient.GetByIdAsync>(SignalRTags.GetCompaniesById, _hotel.ServiceProviderId); + List? productOwner = null; + if (_hotel != null) productOwner = await AdminSignalRClient.GetByIdAsync>(SignalRTags.GetCompaniesById, _hotel.ServiceProviderId); + if (productOwner != null) { ImageSource = await ServiceProviderDataService.GetQRCodeByProductIdAsync(productOwner[0].AffiliateId); diff --git a/TIAMSharedUI/Pages/User/MyServiceProviders.razor b/TIAMSharedUI/Pages/User/MyServiceProviders.razor index 282a328e..6e1cace2 100644 --- a/TIAMSharedUI/Pages/User/MyServiceProviders.razor +++ b/TIAMSharedUI/Pages/User/MyServiceProviders.razor @@ -138,7 +138,7 @@ //----------------------------------------------------------------------------------- - public async Task SubmitForm(object result) + public void SubmitForm(object result) { //await WizardProcessor.ProcessWizardAsync(Result.GetType(), Result); _logger.Info($"Submitted nested form: {result.GetType().FullName}"); @@ -162,7 +162,7 @@ _logger = new LoggerClient(LogWriters.ToArray()); var myId = SessionService.User!.UserId; - _logger.Debug(companies.Count().ToString()); + _logger.Debug(companies.Count.ToString()); _contextIds = new Guid[1]; _contextIds[0] = myId; var result = await AdminSignalRClient.GetByIdAsync>(SignalRTags.GetCompaniesByContextId, myId); diff --git a/TIAMSharedUI/Shared/Components/BaseComponents/BasePageComponent.cs b/TIAMSharedUI/Shared/Components/BaseComponents/BasePageComponent.cs index f6954e1f..27abd721 100644 --- a/TIAMSharedUI/Shared/Components/BaseComponents/BasePageComponent.cs +++ b/TIAMSharedUI/Shared/Components/BaseComponents/BasePageComponent.cs @@ -58,7 +58,7 @@ namespace TIAMSharedUI.Shared.Components.BaseComponents var currentUrl = _navManager.ToBaseRelativePath(_navManager.Uri); _pageState.AddPageToHistory(currentUrl); - _logger.Debug(_pageState.GetGoBackPage()); + //_logger.Debug(_pageState.GetGoBackPage()); } } } diff --git a/TIAMSharedUI/Shared/Components/Navbar.razor.cs b/TIAMSharedUI/Shared/Components/Navbar.razor.cs index 90669836..e06a816f 100644 --- a/TIAMSharedUI/Shared/Components/Navbar.razor.cs +++ b/TIAMSharedUI/Shared/Components/Navbar.razor.cs @@ -112,7 +112,6 @@ namespace TIAMSharedUI.Shared.Components protected override void OnInitialized() { - base.OnInitialized(); navigationManager.LocationChanged += OnLocationChanged; _logger = new LoggerClient(LogWriters.ToArray()); @@ -120,7 +119,7 @@ namespace TIAMSharedUI.Shared.Components _logger.Debug($"Navbar OnInit {DateTime.Now} "); - InitUser(); + if (sessionService.IsAuthenticated) InitUser(); } private void OnLocationChanged(object sender, LocationChangedEventArgs e) @@ -157,6 +156,7 @@ namespace TIAMSharedUI.Shared.Components myUser = true; userId = sessionService.User.UserId; userEmail = sessionService.User.Email; + if (sessionService.User.UserModelDto.ProfileDto.FullName != null) { userFullName = sessionService.User.UserModelDto.ProfileDto.FullName!; @@ -169,15 +169,13 @@ namespace TIAMSharedUI.Shared.Components } var properties = sessionService.User?.HasProperties; - - if (properties == null) - return; - - + if (properties == null) return; + hasProperty = properties.Count > 0; isSysAdmin = sessionService.IsSysAdmin; isDevAdmin = sessionService.IsDevAdmin; isDriver = sessionService.IsDriver; + foreach (var property in properties) { _logger.Detail($"First property: {property.Value} "); diff --git a/TIAMWebApp/Server/Controllers/UserAPIController.cs b/TIAMWebApp/Server/Controllers/UserAPIController.cs index 49265339..c5d6eef2 100644 --- a/TIAMWebApp/Server/Controllers/UserAPIController.cs +++ b/TIAMWebApp/Server/Controllers/UserAPIController.cs @@ -26,6 +26,7 @@ using TIAM.Services.Server.Logins; using TIAMWebApp.Server.Services; using AyCode.Core.Enums; using AyCode.Models.Enums; +using AyCode.Utils.Extensions; using TIAM.Models; namespace TIAMWebApp.Server.Controllers @@ -119,7 +120,7 @@ namespace TIAMWebApp.Server.Controllers var response = new MainResponse { - Content = new AuthenticationResponse + Content = new AuthenticationTokens { RefreshToken = loggedInModel.LoggedInUser.RefreshToken, AccessToken = loggedInModel.AccessToken @@ -135,16 +136,87 @@ namespace TIAMWebApp.Server.Controllers [AllowAnonymous] [HttpPost] [Route(APIUrls.RefreshTokenRouteName)] - public async Task RefreshToken(RefreshTokenRequest? refreshTokenRequest) + public async Task RefreshToken(AuthenticationTokens? refreshTokenRequest) { - _logger.Info(@"RefreshToken called"); + var mainResponse = await RefreshTokenSignalR(refreshTokenRequest); + + return mainResponse.IsSuccess ? Ok(mainResponse) : BadRequest(mainResponse); + + //_logger.Info(@"RefreshToken called"); + + //var response = new MainResponse(); + //if (refreshTokenRequest is null) + //{ + // _logger.Info(@"RefreshTokenRequest is null"); + + // response.ErrorMessage = "Invalid request"; + // return BadRequest(response); + //} + + //var principal = _loginService.GetPrincipalFromExpiredToken(refreshTokenRequest.AccessToken); + + //if (principal != null) + //{ + // _logger.Info(@"Principal is not null"); + // var email = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email); + + // //var userModel = await _userManager.FindByEmailAsync(email?.Value); + // //UserModel? user = users.FirstOrDefault(x => x.Email == email?.Value); + // User? dbUser = null; + + // if (email != null) + // { + // //get user from db + // dbUser = await userDal.GetUserByEmailAsync(email.Value, true); + // _logger.Info($@"DbUser email: {dbUser?.EmailAddress}"); + // } + + // //mocking - update userModel with new refreshToken so it returns true after the check below + // //dbUser.RefreshToken = refreshTokenRequest.RefreshToken; + + // if (dbUser is null || dbUser.RefreshToken != refreshTokenRequest.RefreshToken) + // { + // response.ErrorMessage = "Invalid Request"; + // _logger.Info($@"{dbUser?.RefreshToken}, {refreshTokenRequest.RefreshToken}"); + + // return BadRequest(response); + // } + + // var newAccessToken = _loginService.GenerateAccessToken(dbUser); + // var refreshToken = _loginService.GenerateRefreshToken(); + + // //mocking - update userModel with new refreshToken + // dbUser.RefreshToken = refreshToken; + // //TODO await _userManager.UpdateAsync(userModel); + // await userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken); + + // response.IsSuccess = true; + // response.Content = new AuthenticationResponse + // { + // RefreshToken = refreshToken, + // AccessToken = newAccessToken + // }; + + // return Ok(response); + //} + + //_logger.Info(@"Principal is null"); + //return NotFound("Invalid Token Found"); + } + + [NonAction] + [SignalR(SignalRTags.RefreshToken)] + public async Task RefreshTokenSignalR(AuthenticationTokens? refreshTokenRequest) + { + _logger.Info("RefreshToken called"); var response = new MainResponse(); if (refreshTokenRequest is null) { - _logger.Info(@"RefreshTokenRequest is null"); - response.ErrorMessage = "Invalid request"; - return BadRequest(response); + _logger.Info("RefreshTokenRequest is null"); + + response.ErrorMessage = "Invalid request"; + return response; } var principal = _loginService.GetPrincipalFromExpiredToken(refreshTokenRequest.AccessToken); @@ -152,49 +224,43 @@ namespace TIAMWebApp.Server.Controllers if (principal != null) { _logger.Info(@"Principal is not null"); - var email = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email); - //var userModel = await _userManager.FindByEmailAsync(email?.Value); - //UserModel? user = users.FirstOrDefault(x => x.Email == email?.Value); User? dbUser = null; - if (email != null) + var emailClaim = principal.Claims.FirstOrDefault(f => f.Type == ClaimTypes.Email); + if (emailClaim != null) dbUser = await userDal.GetUserByEmailAsync(emailClaim.Value, true); + + if (dbUser is null || refreshTokenRequest.RefreshToken.IsNullOrWhiteSpace() || dbUser.RefreshToken != refreshTokenRequest.RefreshToken) { - //get user from db - dbUser = await userDal.GetUserByEmailAsync(email.Value, true); - _logger.Info($@"DbUser email: {dbUser?.EmailAddress}"); + response.ErrorMessage = "User not found or RefreshToken is not valid!"; + _logger.Info($"{response.ErrorMessage}; dbUser.RefreshToken: {dbUser?.RefreshToken}, refreshTokenRequest.RefreshToken: {refreshTokenRequest.RefreshToken}"); + + return response; } - //mocking - update userModel with new refreshToken so it returns true after the check below - //dbUser.RefreshToken = refreshTokenRequest.RefreshToken; - - if (dbUser is null || dbUser.RefreshToken != refreshTokenRequest.RefreshToken) - { - response.ErrorMessage = "Invalid Request"; - _logger.Info($@"{dbUser?.RefreshToken}, {refreshTokenRequest.RefreshToken}"); - return BadRequest(response); - } + _logger.Info($"DbUser email: {dbUser.EmailAddress}"); var newAccessToken = _loginService.GenerateAccessToken(dbUser); var refreshToken = _loginService.GenerateRefreshToken(); - //mocking - update userModel with new refreshToken dbUser.RefreshToken = refreshToken; - //TODO await _userManager.UpdateAsync(userModel); await userDal.UpdateJwtRefreshTokenAsync(dbUser.EmailAddress, dbUser.RefreshToken); - response.IsSuccess = true; - response.Content = new AuthenticationResponse + response.Content = new AuthenticationTokens { RefreshToken = refreshToken, AccessToken = newAccessToken }; - return Ok(response); + response.IsSuccess = true; } - - _logger.Info(@"Principal is null"); - return NotFound("Invalid Token Found"); + else + { + _logger.Info($"Principal is null! AccessToken: {refreshTokenRequest.AccessToken}"); + response.ErrorMessage = "Principal is null"; + } + + return response; } [AllowAnonymous] diff --git a/TIAMWebApp/Server/Models/RefreshTokenRequest.cs b/TIAMWebApp/Server/Models/RefreshTokenRequest.cs deleted file mode 100644 index 5d811627..00000000 --- a/TIAMWebApp/Server/Models/RefreshTokenRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace TIAMWebApp.Server.Models -{ - public class RefreshTokenRequest - { - public string AccessToken { get; set; } - public string RefreshToken { get; set; } - } -} diff --git a/TIAMWebApp/Shared/Models/AuthenticateRequestAndResponse.cs b/TIAMWebApp/Shared/Models/AuthenticateRequestAndResponse.cs deleted file mode 100644 index bb5d5bf6..00000000 --- a/TIAMWebApp/Shared/Models/AuthenticateRequestAndResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ - -namespace TIAMWebApp.Shared.Application.Models -{ - public class AuthenticateRequestAndResponse - { - public string AccessToken { get; set; } - public string RefreshToken { get; set; } - } -} diff --git a/TIAMWebApp/Shared/Models/AuthenticationResponse.cs b/TIAMWebApp/Shared/Models/AuthenticationTokens.cs similarity index 80% rename from TIAMWebApp/Shared/Models/AuthenticationResponse.cs rename to TIAMWebApp/Shared/Models/AuthenticationTokens.cs index 516f61e8..f3c72612 100644 --- a/TIAMWebApp/Shared/Models/AuthenticationResponse.cs +++ b/TIAMWebApp/Shared/Models/AuthenticationTokens.cs @@ -1,6 +1,6 @@ namespace TIAMWebApp.Shared.Application.Models { - public class AuthenticationResponse + public class AuthenticationTokens { public string? AccessToken { get; set; } public string? RefreshToken { get; set; } diff --git a/TIAMWebApp/Shared/Models/ClientSide/UI/TransferStatusModel.cs b/TIAMWebApp/Shared/Models/ClientSide/UI/TransferStatusModel.cs index 044a67c4..03ef1709 100644 --- a/TIAMWebApp/Shared/Models/ClientSide/UI/TransferStatusModel.cs +++ b/TIAMWebApp/Shared/Models/ClientSide/UI/TransferStatusModel.cs @@ -2,16 +2,10 @@ namespace TIAMWebApp.Shared.Application.Models.ClientSide.UI { - public class TransferStatusModel + public class TransferStatusModel(TransferStatusType statusValue, string statusName) { - public TransferStatusType StatusValue { get; set; } - public string StatusName { get; set; } - - public TransferStatusModel(TransferStatusType statusValue, string statusName) - { - StatusValue = statusValue; - StatusName = statusName; - } + public TransferStatusType StatusValue { get; set; } = statusValue; + public string StatusName { get; set; } = statusName; public static TransferStatusModel GetStatusModel(TransferStatusType transferStatusType) => AllStatuses[transferStatusType]; diff --git a/TIAMWebApp/Shared/Services/UserDataServiceClientBase.cs b/TIAMWebApp/Shared/Services/UserDataServiceClientBase.cs index f562f87f..cd012412 100644 --- a/TIAMWebApp/Shared/Services/UserDataServiceClientBase.cs +++ b/TIAMWebApp/Shared/Services/UserDataServiceClientBase.cs @@ -1,8 +1,10 @@ using System.Net.Http.Json; using System.Text; using System.Text.Json; +using AyCode.Core.Extensions; using AyCode.Interfaces.StorageHandlers; using AyCode.Services.Loggers; +using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json; using TIAM.Models.Dtos.Users; using TIAM.Services; @@ -265,38 +267,40 @@ public abstract class UserDataServiceClientBase : IUserDataService Logger.Debug("RefreshToken() called"); var isTokenRefreshed = false; - var url = $"{Setting.ApiBaseUrl}/{APIUrls.RefreshToken}"; - //var url = APIUrls.RefreshToken; - - var serializedStr = JsonConvert.SerializeObject(new AuthenticateRequestAndResponse - { - RefreshToken = Setting.UserBasicDetails.RefreshToken, - AccessToken = Setting.UserBasicDetails.AccessToken - }); + MainResponse? mainResponse = null; try { - Logger.Debug("Refreshtoken url: " + url); - var response = await Http.PostAsync(url, new StringContent(serializedStr, Encoding.UTF8, "application/json")); - if (response.IsSuccessStatusCode) + var postAuthenticationTokens = new AuthenticationTokens { - var contentStr = await response.Content.ReadAsStringAsync(); - var mainResponse = JsonConvert.DeserializeObject(contentStr); - if (mainResponse.IsSuccess) + RefreshToken = Setting.UserBasicDetails.RefreshToken, + AccessToken = Setting.UserBasicDetails.AccessToken + }; + + mainResponse = await AdminSignalRClient.PostDataAsync(SignalRTags.RefreshToken, postAuthenticationTokens); + + if (mainResponse is { IsSuccess: true }) + { + var tokenDetails = mainResponse.Content.ToJson().JsonTo(); + if (tokenDetails == null || string.IsNullOrWhiteSpace(tokenDetails.AccessToken) || string.IsNullOrWhiteSpace(tokenDetails.RefreshToken)) + { + Logger.Error($"Refreshtoken error! tokenDetails == null || string.IsNullOrWhiteSpace(tokenDetails.AccessToken) || string.IsNullOrWhiteSpace(tokenDetails.RefreshToken); AccessToken: {tokenDetails?.AccessToken}; RefreshToken: {tokenDetails?.RefreshToken}"); + } + else { - var tokenDetails = JsonConvert.DeserializeObject(mainResponse.Content.ToString()); Setting.UserBasicDetails.AccessToken = tokenDetails.AccessToken; Setting.UserBasicDetails.RefreshToken = tokenDetails.RefreshToken; - var userDetailsStr = JsonConvert.SerializeObject(Setting.UserBasicDetails); + var userDetailsStr = Setting.UserBasicDetails.ToJson(); //JsonConvert.SerializeObject(Setting.UserBasicDetails); await SecureStorageHandler.SaveToSecureStorageAsync(nameof(Setting.UserBasicDetails), userDetailsStr); isTokenRefreshed = true; } } + else Logger.Info($"Refreshtoken is not success! {mainResponse?.ErrorMessage ?? "mainResponse == null"}"); } catch (Exception ex) { - Logger.Error("Refreshtoken exception: " + ex.Message, ex); + Logger.Error($"Refreshtoken, {mainResponse?.ErrorMessage ?? "mainResponse == null"}! exception: {ex.Message}", ex); } return isTokenRefreshed; diff --git a/TIAMWebApp/Shared/Utility/PageHistoryState.cs b/TIAMWebApp/Shared/Utility/PageHistoryState.cs index fff7834d..fe3b6dea 100644 --- a/TIAMWebApp/Shared/Utility/PageHistoryState.cs +++ b/TIAMWebApp/Shared/Utility/PageHistoryState.cs @@ -15,12 +15,18 @@ namespace TIAMWebApp.Shared.Application.Utility public void AddPageToHistory(string pageUrl) { + if (_previousPages.Count > 0 && _previousPages[^1] == pageUrl) return; + _previousPages.Add(pageUrl); } public string GetGoBackPage() { - return _previousPages.Count > 1 ? _previousPages[^2] : _previousPages.FirstOrDefault() ?? string.Empty; + if (_previousPages.Count == 0) return string.Empty; + + _previousPages.RemoveAt(_previousPages.Count - 1); + + return _previousPages.Count > 0 ? _previousPages[^1] : string.Empty; } public bool CanGoBack()