namespace TaxBaik.Web.Services; using Microsoft.AspNetCore.Components; using System.Text.Json; public interface IApiClient { Task GetAsync(string endpoint); Task PostAsync(string endpoint, object data); Task PutAsync(string endpoint, object data); Task DeleteAsync(string endpoint); Task SetAuthToken(string? token); } public class ApiClient : IApiClient { private readonly HttpClient _httpClient; private readonly NavigationManager _navigationManager; private string? _authToken; public ApiClient(HttpClient httpClient, NavigationManager navigationManager) { _httpClient = httpClient; _navigationManager = navigationManager; } public async Task SetAuthToken(string? token) { _authToken = token; if (token != null) _httpClient.DefaultRequestHeaders.Authorization = new("Bearer", token); else _httpClient.DefaultRequestHeaders.Authorization = null; } public async Task GetAsync(string endpoint) { try { var response = await _httpClient.GetAsync(BuildApiUri(endpoint)); if (!response.IsSuccessStatusCode) return default; var content = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(content, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task PostAsync(string endpoint, object data) { try { var json = JsonSerializer.Serialize(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync(BuildApiUri(endpoint), content); if (!response.IsSuccessStatusCode) return default; var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task PutAsync(string endpoint, object data) { try { var json = JsonSerializer.Serialize(data); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PutAsync(BuildApiUri(endpoint), content); if (!response.IsSuccessStatusCode) return default; var responseContent = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); } catch { return default; } } public async Task DeleteAsync(string endpoint) { try { await _httpClient.DeleteAsync(BuildApiUri(endpoint)); } catch { // Ignore } } private Uri BuildApiUri(string endpoint) { var relative = $"api/{endpoint.TrimStart('/')}"; return new Uri(new Uri(_navigationManager.BaseUri), relative); } }