@using System.Net @using System.IdentityModel.Tokens.Jwt @using System.Security.Claims @using BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions @using BlazorWebAssemblyVisaApiClient.ErrorHandling @using VisaApiClient @code { public static bool LoggedIn; public static ApplicantModel? CurrentApplicant; //todo api action public static string? CurrentRole; private static AuthData savedData = null!; private static readonly JwtSecurityTokenHandler TokenHandler = new(); [CascadingParameter] private GlobalErrorHandler ErrorHandler { get; set; } = null!; [CascadingParameter] private Status? Status { get; set; } [Inject] private Client Client { get; set; } = null!; [Inject] private NavigationManager Nav { get; set; } = null!; ///Authorize with email and password /// Message to user public async Task TryAuthorize(AuthData authData) { Status?.SetMessage("Wait..."); try { var token = await Client.LoginAsync(authData.Email, authData.Password); Client.SetAuthToken(token); CurrentRole = TokenHandler.ReadJwtToken(token.Token) .Claims .FirstOrDefault(claim => claim.Type == ClaimTypes.Role)? .Value; savedData = authData; Status?.SetSucces("Logged in successfully."); } catch (ApiException e) { if (e.Result.Status == (int)HttpStatusCode.Forbidden) { Status?.SetError(e.Result.Detail!); } else { Status?.SetError("Error occured"); ErrorHandler.Handle(e); } } catch (Exception e) { Status?.SetError("Error occured"); ErrorHandler.Handle(e); } } ///Re-auth if token expired or something public async Task ReAuthenticate(bool redirectOnFailure = true) { if (!LoggedIn) { if (redirectOnFailure) { Nav.NavigateTo("/"); return; } throw new NotLoggedInException(); } await TryAuthorize(savedData); } }