From bcd7b5f141861a97e8c82cc2458c5ed3f19fa1df Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Sun, 7 Jun 2026 05:14:02 +0800 Subject: [PATCH] dm-91 --- app/build.gradle.kts | 4 +++ .../Message/ViewModel/Detail/Message_Cache.kt | 34 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Cache.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3a7973e..f9bcaf9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -95,4 +95,8 @@ dependencies { implementation("androidx.emoji2:emoji2:$emoji2Version") implementation("androidx.emoji2:emoji2-bundled:$emoji2Version") // 自帶字型包 + val roomVersion = "2.6.1" // 可以使用目前穩定的 2.6.1 或最新版本 + implementation("androidx.room:room-runtime:$roomVersion") + implementation("androidx.room:room-ktx:$roomVersion") // 支援 Flow 必須要加這行 + ksp("androidx.room:room-compiler:$roomVersion") // 使用 KSP 來編譯 Room 註解 } \ No newline at end of file diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Cache.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Cache.kt new file mode 100644 index 0000000..204680e --- /dev/null +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Cache.kt @@ -0,0 +1,34 @@ +package com.example.login_v3.home.Message.ViewModel.Detail + +import androidx.room.Dao +import androidx.room.Entity +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.PrimaryKey +import kotlinx.coroutines.flow.Flow +import androidx.room.Query + +enum class MessageStatus { SENDING, SUCCESS, FAILED } + +@Entity(tableName = "messages") +data class MessageEntity( + @PrimaryKey val id: String, // 臨時訊息可以用 UUID.randomUUID().toString() + val roomId: String, + val content: String, + val senderId: String, + val timestamp: Long, + val status: MessageStatus // 👈 核心:用來控制 UI 顯示樣式 +) + +@Dao +interface MessageDao { + // 💡 監聽特定聊天室的訊息流 + @Query("SELECT * FROM messages WHERE roomId = :roomId ORDER BY timestamp ASC") + fun getMessagesFlow(roomId: String): Flow> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertOrUpdate(message: MessageEntity) + + @Query("DELETE FROM messages WHERE id = :id") + suspend fun deleteById(id: String) +} \ No newline at end of file