From 041fa0bd9cecc2896356be71982c21838f03bbc9 Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Fri, 8 May 2026 15:49:02 +0800 Subject: [PATCH] auth to server-V69 --- .../data/api/api_class/FriendRequest.kt | 20 +++++---- .../repository/basic/Friends_Repository.kt | 13 +++--- .../Detail/Contact_list_ViewModel.kt | 43 ++++++------------- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt b/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt index 01661a6..84698e6 100644 --- a/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt +++ b/app/src/main/java/com/example/login_v3/data/api/api_class/FriendRequest.kt @@ -6,7 +6,8 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class FriendListResponse( - val friends: List + // 這樣寫最安全:即便 JSON 裡少了這個欄位,也會變成 emptyList + val friends: List = emptyList() ) @JsonClass(generateAdapter = true) data class Friend( @@ -15,10 +16,10 @@ data class Friend( val username: String?, // 建議 username 也改可空 - @field:Json(name = "display_name") + @Json(name = "display_name") // 移除 field: 試試看 val displayName: String?, - @field:Json(name = "avatar_url") + @Json(name = "avatar_url") val avatarUrl: String?, val status: String?, @@ -27,12 +28,13 @@ data class Friend( val acceptedAt: String? ) val Friend.fullFriendsAvatarUrl: Any - get() = if (avatarUrl.isNullOrBlank()) { - R.drawable.avatar_v1 - } else if (avatarUrl.startsWith("http")) { - avatarUrl - } else { - "http://192.168.0.217$avatarUrl" + get() { + val url = avatarUrl ?: "" + return when { + url.isBlank() -> R.drawable.avatar_v1 + url.startsWith("http") -> url + else -> "http://192.168.0.217$url" + } } diff --git a/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt b/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt index 2df6723..844c04d 100644 --- a/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt +++ b/app/src/main/java/com/example/login_v3/data/repository/basic/Friends_Repository.kt @@ -9,13 +9,14 @@ class FriendsRepository @Inject constructor( private val apiService: TecnologiaApi ) { - suspend fun getFriendList(): Result> { + suspend fun getFriendList(): Result> { return try { val response = apiService.getFriends() - // 回傳成功,並直接提取裡面的 List - Result.success(response.friends) + // 如果 apiService 直接回傳 FriendListResponse (非 Response 封裝) + // 則直接取用,並處理 null + Result.success(response.friends ?: emptyList()) } catch (e: Exception) { - // 處理連線超時、404、500 等各種錯誤 + // 這裡可以根據 e 的型別做額外處理,例如 HttpException 或 IOException Result.failure(e) } } @@ -23,8 +24,8 @@ class FriendsRepository @Inject constructor( suspend fun getPendingRequests(): Result> { return try { val response = apiService.getFriendsPending() - // 這裡回傳 API Model,轉換邏輯可以放在 ViewModel - Result.success(response.pendingRequests) + // 這裡同樣建議處理可能為 null 的情況 + Result.success(response.pendingRequests ?: emptyList()) } catch (e: Exception) { Result.failure(e) } diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt index 2c1bdb0..6bea42e 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Contact_list_ViewModel.kt @@ -29,44 +29,27 @@ class ContactListViewModel @Inject constructor( private val _uiState = MutableStateFlow(ContactUiState()) val uiState: StateFlow = _uiState.asStateFlow() - // 🚩 建議刪除獨立的 _friends,全部統一使用 _uiState - init { refreshAll() } fun refreshAll() { - fetchFriends() - fetchPendingRequests() - } - - fun fetchFriends() { viewModelScope.launch { - _uiState.update { it.copy(isLoading = true) } + // 1. 開始 Loading 並清除舊錯誤 + _uiState.update { it.copy(isLoading = true, error = null) } - val result = repository.getFriendList() + // 2. 使用 zip 或單獨 fetch,這裡示範簡單的循序或並行處理 + val friendsResult = repository.getFriendList() + val pendingResult = repository.getPendingRequests() - result.onSuccess { list -> - Log.d("DEBUG_API", "好友列表抓取成功,數量: ${list.size}") - _uiState.update { it.copy(isLoading = false, friends = list) } - }.onFailure { error -> - Log.e("DEBUG_API", "好友列表抓取失敗: ${error.message}") - _uiState.update { it.copy(isLoading = false, error = error.message) } - } - } - } - - fun fetchPendingRequests() { - viewModelScope.launch { - val result = repository.getPendingRequests() - - result.onSuccess { requests -> - Log.d("DEBUG_API", "待處理請求抓取成功,數量: ${requests.size}") - _uiState.update { it.copy(pendingRequests = requests) } - }.onFailure { error -> - // 🚩 這裡一定要加 Log,否則 API 壞了你不知道 - Log.e("DEBUG_API", "待處理請求抓取失敗: ${error.message}") - _uiState.update { it.copy(error = error.message) } + // 3. 統一處理結果 + _uiState.update { state -> + state.copy( + isLoading = false, + friends = friendsResult.getOrDefault(state.friends), + pendingRequests = pendingResult.getOrDefault(state.pendingRequests), + error = (friendsResult.exceptionOrNull() ?: pendingResult.exceptionOrNull())?.message + ) } } }