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(
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 ?: "未知錯誤")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue