From 143f930b473e7e0071137415898dad4b35a3a664 Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Sun, 17 May 2026 20:22:01 +0800 Subject: [PATCH] dm-14 --- .../data/repository/dm/DM_Basic_Repository.kt | 15 +++++++++---- .../Detail/Message_Messaging_ViewModel.kt | 21 +++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt index 3d864a7..5a4f229 100644 --- a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt +++ b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt @@ -10,11 +10,14 @@ import javax.inject.Singleton class ChatRoomsRepository @Inject constructor( private val api: TecnologiaApi ) { + suspend fun fetchRooms(): Result { return try { val response = api.getChatRooms() - if (response.isSuccessful && response.body() != null) { - Result.success(response.body()!!) + if (response.isSuccessful) { + // 使用 body() ?: return ... 可以減少一層 if 巢狀結構 + val body = response.body() ?: return Result.failure(Exception("Rooms response body is null")) + Result.success(body) } else { Result.failure(Exception("Error code: ${response.code()}")) } @@ -25,19 +28,23 @@ class ChatRoomsRepository @Inject constructor( suspend fun getChatMessages(roomId: String): Result { return try { - val response = api.getChatMessages(roomId) // 確保 TecnologiaApi 裡有 getChatMessages 方法 + val response = api.getChatMessages(roomId) if (response.isSuccessful) { val body = response.body() if (body != null) { Result.success(body) } else { + // 如果後端 200 OK 但給空身體,這裏處理 Result.failure(Exception("回應身體為空 (Empty response body)")) } } else { - Result.failure(Exception("網路請求失敗,錯誤碼: ${response.code()}")) + // 建議把後端的錯誤訊息也抓出來(如果後端有寫 error body 的話) + val errorMsg = response.errorBody()?.string() ?: "未知錯誤" + Result.failure(Exception("網路請求失敗,錯誤碼: ${response.code()}, 訊息: $errorMsg")) } } catch (e: Exception) { + // 捕捉網路斷線 (IOException) 或解析失敗 (JsonDataException) 等狀況 Result.failure(e) } } diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt index 802dc32..fe0976f 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt @@ -7,9 +7,10 @@ import com.example.login_v3.data.repository.dm.ChatRoomsRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject -import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf import com.example.login_v3.data.api.api_class.Message +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow sealed interface MessagesUiState { @@ -23,28 +24,22 @@ class ChatViewModel @Inject constructor( private val repository: ChatRoomsRepository ) : ViewModel() { - // 內部的可變狀態,預設為 Loading - private val _uiState = mutableStateOf(MessagesUiState.Loading) + // 1. 使用 MutableStateFlow,並設定初始值 + private val _uiState = MutableStateFlow(MessagesUiState.Loading) - // 公開給 Compose UI 讀取的唯讀狀態 - val uiState: State = _uiState + // 2. 使用 asStateFlow() 公開唯讀的 StateFlow + val uiState: StateFlow = _uiState.asStateFlow() - /** - * 根據 roomId 獲取聊天訊息 - */ fun loadMessages(roomId: String) { viewModelScope.launch { - // 切換回載入中狀態(適用於切換房間或重新整理時) _uiState.value = MessagesUiState.Loading - // 呼叫你的 Repository 方法 repository.getChatMessages(roomId) .onSuccess { response -> - // 成功:將訊息列表塞入 Success 狀態 + // 3. 更新 Flow 的值 _uiState.value = MessagesUiState.Success(messages = response.messages) } .onFailure { exception -> - // 失敗:擷取錯誤訊息並塞入 Error 狀態 _uiState.value = MessagesUiState.Error(message = exception.message ?: "未知錯誤") } }