using Blazored.LocalStorage; using CurrieTechnologies.Razor.SweetAlert2; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Security.Cryptography; using System.Text; using System.Text.Json; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; using BlazorPages.Tools; namespace AbrBlazorTools { public class HttpClientWithLoginToken : IHttpClientWithLoginToken { private readonly HttpClient _httpClient = new HttpClient(); private readonly ILocalStorageService _localStorage; private readonly CurrieTechnologies.Razor.SweetAlert2.SweetAlertService _swal; private readonly AbrBlazorTools.ILoadingSpinner _loadingSpinner; private readonly NavigationManager _navigationManager; private readonly IBrowserTools _browserTools; public HttpClientWithLoginToken(ILocalStorageService localStorage, CurrieTechnologies.Razor.SweetAlert2.SweetAlertService swal , AbrBlazorTools.ILoadingSpinner loadingSpinner, NavigationManager navigationManager, IBrowserTools browserTools) { _localStorage = localStorage; _swal = swal; _loadingSpinner = loadingSpinner; _navigationManager = navigationManager; _browserTools = browserTools; _httpClient.BaseAddress = new Uri(Statics.BaseAddress); } public async Task GetInstance() { var hasToken = await _localStorage.ContainKeyAsync(Statics.LoginTokenKey); if (hasToken) { var token = await _localStorage.GetItemAsStringAsync(Statics.LoginTokenKey); if (token.StartsWith('"')) token = token.Substring(1); if (token.EndsWith('"')) token = token.Substring(0, token.Length - 1); _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); } return _httpClient; } public async Task HttpGet(string url, bool hasLoading = true, bool goToLogin = true) { var res=new HttpResponseMessage(); Console.WriteLine("Get : " + url); if (hasLoading) await _loadingSpinner.ShowLoading(); var http = await GetInstance(); try { res= await http.GetAsync(url); await _loadingSpinner.HideLoading(); if (res.IsSuccessStatusCode) { return res; } if (res.StatusCode == HttpStatusCode.Unauthorized) { await _loadingSpinner.HideLoading(); if (goToLogin) { Console.WriteLine("خطای دسترسی"); _navigationManager.NavigateTo("/"); } } else if (res.StatusCode == HttpStatusCode.BadRequest) { await _swal.FireAsync( message: res.ReasonPhrase, icon: SweetAlertIcon.Error); } } catch (Exception ex) { Console.WriteLine(ex); await _loadingSpinner.HideLoading(); await _swal.FireAsync( message: res.ReasonPhrase, icon: SweetAlertIcon.Error); } await _loadingSpinner.HideLoading(); return new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest }; } public async Task HttpDelete(string url, bool hasLoading = true) { Console.WriteLine("Delete : " + url); var res = new HttpResponseMessage(); if (hasLoading) await _loadingSpinner.ShowLoading(); var http = await GetInstance(); try { res = await http.DeleteAsync(url); await _loadingSpinner.HideLoading(); if (res.IsSuccessStatusCode) { return res; } if (res.StatusCode == HttpStatusCode.Unauthorized) { await _loadingSpinner.HideLoading(); _navigationManager.NavigateTo("/"); } else { dynamic error = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync()); await _swal.FireAsync( message: await ErrorMessage(res), icon: SweetAlertIcon.Error); } } catch (Exception ex) { Console.WriteLine(ex); await _loadingSpinner.HideLoading(); dynamic error = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync()); await _swal.FireAsync( message: await ErrorMessage(res), icon: SweetAlertIcon.Error); Statics.CurrentLoginInfo = new(); } await _loadingSpinner.HideLoading(); return new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest }; } public async Task HttpPut(string url, object model, bool hasLoading = true) { Console.WriteLine("Put : " + url); var res = new HttpResponseMessage(); if (hasLoading) await _loadingSpinner.ShowLoading(); var http = await GetInstance(); try { var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"); res = await http.PutAsync(url, content); await _loadingSpinner.HideLoading(); if (res.IsSuccessStatusCode) { return res; } if (res.StatusCode == HttpStatusCode.Unauthorized) { await _loadingSpinner.HideLoading(); Statics.CurrentLoginInfo = new(); } else { await _swal.FireAsync( message: await ErrorMessage(res), icon: SweetAlertIcon.Error); } } catch (Exception ex) { Console.WriteLine(ex); await _loadingSpinner.HideLoading(); await _swal.FireAsync( message: await ErrorMessage(res), icon: SweetAlertIcon.Error); Statics.CurrentLoginInfo = new(); } await _loadingSpinner.HideLoading(); return new HttpResponseMessage { StatusCode = HttpStatusCode.BadRequest }; } public async Task HttpPost(string url, object model, bool hasLoading = true, bool multiPart = false) { Console.WriteLine("Post : " + url); var res = new HttpResponseMessage(); if (hasLoading) await _loadingSpinner.ShowLoading(); var http = await GetInstance(); try { res = new HttpResponseMessage(); var content = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json"); res = await http.PostAsync(url, content); await _loadingSpinner.HideLoading(); if (res.IsSuccessStatusCode) { return res; } if (res.StatusCode == HttpStatusCode.Unauthorized) { await _loadingSpinner.HideLoading(); _navigationManager.NavigateTo("/"); } else { await _swal.FireAsync( message: await ErrorMessage(res), icon: SweetAlertIcon.Error); } } catch (Exception ex) { Console.WriteLine(ex); await _loadingSpinner.HideLoading(); } await _loadingSpinner.HideLoading(); return res; } private async Task ErrorMessage(HttpResponseMessage res) { var errStr = "خطای نامشخص"; dynamic error = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync()); if (error.errors != null) { errStr = (string)("" + error.errors); if (errStr.Contains(":")) errStr = errStr.Split(':')[1].Replace(":", "").Replace("{", "") .Replace("}", "").Replace("[", "").Replace("]","").Replace("\"",""); } return errStr; } } public interface IHttpClientWithLoginToken { Task GetInstance(); Task HttpPost(string url, object model, bool hasLoading = true, bool multiPart = false); Task HttpGet(string url, bool hasLoading = true, bool goToLogin = true); Task HttpDelete(string url, bool hasLoading = true); Task HttpPut(string url, object model, bool hasLoading = true); } }