This commit is contained in:
Eric85710 2026-05-28 15:23:38 +08:00
parent 7038188236
commit ae490189de

View file

@ -36,6 +36,15 @@ sealed class SendMessageState {
}
// 刪除訊息狀態
sealed class DeleteMessageState {
object Idle : DeleteMessageState() // 閒置
object Loading : DeleteMessageState() // 刪除中
object Success : DeleteMessageState() // 刪除成功
data class Error(val message: String) : DeleteMessageState() // 刪除失敗
}
sealed interface MessagesUiState {
object Loading : MessagesUiState
data class Success(
@ -241,6 +250,52 @@ class ChatViewModel @Inject constructor(
}
}
// 儲存刪除狀態的變數
private val _deleteMessageState = MutableStateFlow<DeleteMessageState>(DeleteMessageState.Idle)
val deleteMessageState: StateFlow<DeleteMessageState> = _deleteMessageState.asStateFlow()
// 刪除訊息的 function
fun deleteMessage(roomId: String, messageId: String) {
viewModelScope.launch {
_deleteMessageState.value = DeleteMessageState.Loading
val result = repository.deleteMessage(roomId, messageId)
result.onSuccess {
_deleteMessageState.value = DeleteMessageState.Success
// 😎【超讚的體驗優化】:不重新 call loadMessages,直接在本地修改該訊息的狀態
val currentState = _uiState.value
if (currentState is MessagesUiState.Success) {
val updatedMessages = currentState.messages.map { message ->
if (message.id == messageId) {
// 將該則訊息改為已刪除狀態(利用 copy 複製,並帶入對應欄位)
message.copy(
isDeleted = true,
content = "此訊息已被刪除" // 可選擇在這裡直接改 content,或交由 UI 根據 isDeleted 顯示對應文字
)
} else {
message
}
}
// 更新 uiState,Compose 畫面會立刻連動刷新
_uiState.value = currentState.copy(messages = updatedMessages)
}
}.onFailure { error ->
Log.e("ChatViewModel", "Delete message failed", error)
_deleteMessageState.value = DeleteMessageState.Error(error.message ?: "刪除訊息失敗")
}
}
}
// 重設刪除狀態的 function (供 UI 重置狀態使用)
fun resetDeleteMessageState() {
_deleteMessageState.value = DeleteMessageState.Idle
}
// 💡 請確保這段程式碼有確實待在 ChatViewModel 裡面
fun resetReactionUsersState() {
_reactionUsersState.value = ReactionUsersState.Idle