using System.Text.Json; using Front.Program.Services; using Front.Program.Models; using Microsoft.JSInterop; namespace Front.Program.ViewModels; public class UserStateService(StorageService _storageService, SecureService _secureService, APIService _APIService, IJSRuntime _js) { public UserData UserData { get; set; } = new UserData(); public bool isFirstCheck { get; set; } = false; public bool isLogin { get; set; } = false; public Models.SimpleAcademy[] academyItems = Array.Empty(); public async Task<(bool success,UserData? userData)> GetUserDataFromStorageAsync() { try { var encUserData = await _storageService.GetItemAsync("UsDt"); if (!string.IsNullOrEmpty(encUserData)) { var decUserData = await _secureService.DecryptAsync(encUserData); var userData = JsonSerializer.Deserialize(decUserData, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); LoggerService.Write($"UserData: {userData.Name}, {userData.Type}"); return (true, userData); } else { return (false, null); } } catch (Exception ex) { LoggerService.Write($"Error [GetUserDataFormAsync] : {ex.Message}"); return (false, null); } } public async Task GetUserDataAsync() { try { LoggerService.Write("GetUserDataAsync 호출됨"); // 로그인 상태가 아니라면 애초에 할 필요 없음 if (await _storageService.GetItemAsync("IsLogin") != "true") { isLogin = false; return false; } var userDataForm = await GetUserDataFromStorageAsync(); if (userDataForm.success && userDataForm.userData != null) { // 사용자 데이터가 성공적으로 로드되었을 때의 로직 UserData = userDataForm.userData; isLogin = true; return true; } else { var userDataFromServer = await GetUserDataFromServerAsync(); if (userDataFromServer.success && userDataFromServer.userData != null) { // 서버에서 사용자 데이터를 성공적으로 로드했을 때의 로직 UserData = userDataFromServer.userData; isLogin = true; return true; } else { // 사용자 데이터를 로드하지 못했을 때의 로직 LoggerService.Write("사용자 데이터를 로드하지 못했습니다."); isLogin = false; return false; } } } finally { if (!isFirstCheck) isFirstCheck = true; } } public async Task ClearUserStateAsnyc() { try { string[] keys = { "UsDt", "IsLogin", "UsAcDt" }; foreach (var key in keys) { var remove = await _storageService.RemoveItemAsync(key); LoggerService.Write("사용자 데이터 삭제" + (remove ? "성공 :" : "실패 :") + key); } ClearStateData(); } catch (Exception ex) { LoggerService.Write($"사용자 데이터 삭제 중 오류: {ex.Message}"); } } private void ClearStateData() { isLogin = false; UserData = new UserData(); academyItems = Array.Empty(); } public async Task<(bool success, UserData? userData)> GetUserDataFromServerAsync() { var data = await _APIService.GetConnectServerAsnyc("/api/v1/in/user"); if (data is { success: true, json: not null }) await _storageService.SetItemAsync("UsDt", data.json); return (data.success, data.data); } public async Task<(bool success, List? simpleAcademy)> GetAcademy() { var data = await _APIService.GetConnectServerAsnyc>("/api/v1/in/user/academy"); if (data is { success: true, json: not null }) await _storageService.SetItemAsync("UsAcDt", data.json); return (data.success, data.data); } }