dm-14
This commit is contained in:
parent
003d742a01
commit
143f930b47
2 changed files with 19 additions and 17 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 ?: "未知錯誤")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue