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( class ChatRoomsRepository @Inject constructor(
private val api: TecnologiaApi private val api: TecnologiaApi
) { ) {
suspend fun fetchRooms(): Result<RoomListResponse> { suspend fun fetchRooms(): Result<RoomListResponse> {
return try { return try {
val response = api.getChatRooms() val response = api.getChatRooms()
if (response.isSuccessful && response.body() != null) { if (response.isSuccessful) {
Result.success(response.body()!!) // 使用 body() ?: return ... 可以減少一層 if 巢狀結構
val body = response.body() ?: return Result.failure(Exception("Rooms response body is null"))
Result.success(body)
} else { } else {
Result.failure(Exception("Error code: ${response.code()}")) Result.failure(Exception("Error code: ${response.code()}"))
} }
@ -25,19 +28,23 @@ class ChatRoomsRepository @Inject constructor(
suspend fun getChatMessages(roomId: String): Result<MessageResponse> { suspend fun getChatMessages(roomId: String): Result<MessageResponse> {
return try { return try {
val response = api.getChatMessages(roomId) // 確保 TecnologiaApi 裡有 getChatMessages 方法 val response = api.getChatMessages(roomId)
if (response.isSuccessful) { if (response.isSuccessful) {
val body = response.body() val body = response.body()
if (body != null) { if (body != null) {
Result.success(body) Result.success(body)
} else { } else {
// 如果後端 200 OK 但給空身體,這裏處理
Result.failure(Exception("回應身體為空 (Empty response body)")) Result.failure(Exception("回應身體為空 (Empty response body)"))
} }
} else { } else {
Result.failure(Exception("網路請求失敗,錯誤碼: ${response.code()}")) // 建議把後端的錯誤訊息也抓出來(如果後端有寫 error body 的話)
val errorMsg = response.errorBody()?.string() ?: "未知錯誤"
Result.failure(Exception("網路請求失敗,錯誤碼: ${response.code()}, 訊息: $errorMsg"))
} }
} catch (e: Exception) { } catch (e: Exception) {
// 捕捉網路斷線 (IOException) 或解析失敗 (JsonDataException) 等狀況
Result.failure(e) 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 dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject 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 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 { sealed interface MessagesUiState {
@ -23,28 +24,22 @@ class ChatViewModel @Inject constructor(
private val repository: ChatRoomsRepository private val repository: ChatRoomsRepository
) : ViewModel() { ) : ViewModel() {
// 內部的可變狀態,預設為 Loading // 1. 使用 MutableStateFlow,並設定初始值
private val _uiState = mutableStateOf<MessagesUiState>(MessagesUiState.Loading) private val _uiState = MutableStateFlow<MessagesUiState>(MessagesUiState.Loading)
// 公開給 Compose UI 讀取的唯讀狀態 // 2. 使用 asStateFlow() 公開唯讀的 StateFlow
val uiState: State<MessagesUiState> = _uiState val uiState: StateFlow<MessagesUiState> = _uiState.asStateFlow()
/**
* 根據 roomId 獲取聊天訊息
*/
fun loadMessages(roomId: String) { fun loadMessages(roomId: String) {
viewModelScope.launch { viewModelScope.launch {
// 切換回載入中狀態(適用於切換房間或重新整理時)
_uiState.value = MessagesUiState.Loading _uiState.value = MessagesUiState.Loading
// 呼叫你的 Repository 方法
repository.getChatMessages(roomId) repository.getChatMessages(roomId)
.onSuccess { response -> .onSuccess { response ->
// 成功:將訊息列表塞入 Success 狀態 // 3. 更新 Flow 的值
_uiState.value = MessagesUiState.Success(messages = response.messages) _uiState.value = MessagesUiState.Success(messages = response.messages)
} }
.onFailure { exception -> .onFailure { exception ->
// 失敗:擷取錯誤訊息並塞入 Error 狀態
_uiState.value = MessagesUiState.Error(message = exception.message ?: "未知錯誤") _uiState.value = MessagesUiState.Error(message = exception.message ?: "未知錯誤")
} }
} }