This commit is contained in:
Eric85710 2026-05-17 20:22:01 +08:00
parent 003d742a01
commit 143f930b47
2 changed files with 19 additions and 17 deletions

View file

@ -10,11 +10,14 @@ import javax.inject.Singleton
class ChatRoomsRepository @Inject constructor(
private val api: TecnologiaApi
) {
suspend fun fetchRooms(): Result<RoomListResponse> {
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<MessageResponse> {
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)
}
}

View file

@ -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>(MessagesUiState.Loading)
// 1. 使用 MutableStateFlow,並設定初始值
private val _uiState = MutableStateFlow<MessagesUiState>(MessagesUiState.Loading)
// 公開給 Compose UI 讀取的唯讀狀態
val uiState: State<MessagesUiState> = _uiState
// 2. 使用 asStateFlow() 公開唯讀的 StateFlow
val uiState: StateFlow<MessagesUiState> = _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 ?: "未知錯誤")
}
}