From a50881a3e036a107e291b7235371f7ab11e652e7 Mon Sep 17 00:00:00 2001 From: Eric85710 Date: Mon, 8 Jun 2026 10:52:49 +0800 Subject: [PATCH] dm-99 --- .../example/login_v3/data/di/AppDatabase.kt | 2 + .../example/login_v3/data/di/TypeConverter.kt | 27 +++++++++++++ .../data/repository/dm/DM_Basic_Repository.kt | 39 ++++--------------- .../Message/UI/Detail/Message_Messaging.kt | 3 -- .../Message/ViewModel/Detail/Message_Cache.kt | 4 +- .../Detail/Message_Messaging_ViewModel.kt | 12 ------ 6 files changed, 40 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/com/example/login_v3/data/di/TypeConverter.kt diff --git a/app/src/main/java/com/example/login_v3/data/di/AppDatabase.kt b/app/src/main/java/com/example/login_v3/data/di/AppDatabase.kt index e3c95bc..5fe81ab 100644 --- a/app/src/main/java/com/example/login_v3/data/di/AppDatabase.kt +++ b/app/src/main/java/com/example/login_v3/data/di/AppDatabase.kt @@ -2,10 +2,12 @@ package com.example.login_v3.data.di import androidx.room.Database import androidx.room.RoomDatabase +import androidx.room.TypeConverters import com.example.login_v3.home.Message.ViewModel.Detail.MessageDao import com.example.login_v3.home.Message.ViewModel.Detail.MessageEntity @Database(entities = [MessageEntity::class], version = 1, exportSchema = false) +@TypeConverters(RoomConverters::class) abstract class AppDatabase : RoomDatabase() { abstract fun messageDao(): MessageDao } \ No newline at end of file diff --git a/app/src/main/java/com/example/login_v3/data/di/TypeConverter.kt b/app/src/main/java/com/example/login_v3/data/di/TypeConverter.kt new file mode 100644 index 0000000..0cd3f5a --- /dev/null +++ b/app/src/main/java/com/example/login_v3/data/di/TypeConverter.kt @@ -0,0 +1,27 @@ +package com.example.login_v3.data.di + +import androidx.room.TypeConverter +import com.example.login_v3.data.api.api_class.Reaction +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types + +class RoomConverters { + private val moshi = Moshi.Builder().build() + private val reactionListType = Types.newParameterizedType(List::class.java, Reaction::class.java) + private val adapter = moshi.adapter>(reactionListType) + + @TypeConverter + fun fromReactionList(reactions: List?): String? { + return adapter.toJson(reactions ?: emptyList()) + } + + @TypeConverter + fun toReactionList(json: String?): List? { + if (json.isNullOrBlank()) return emptyList() + return try { + adapter.fromJson(json) + } catch (e: Exception) { + emptyList() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt index b783cc5..00f75dc 100644 --- a/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt +++ b/app/src/main/java/com/example/login_v3/data/repository/dm/DM_Basic_Repository.kt @@ -61,7 +61,8 @@ class ChatRoomsRepository @Inject constructor( isEdited = entity.isEdited, isDeleted = entity.isDeleted, replyToId = entity.replyToId, - status = entity.status // ๐Ÿ‘ˆ ๆŠŠ Room ๅ„ฒๅญ˜็š„็‹€ๆ…‹ๅ€’ๅ‡บไพ†็ตฆ UI + status = entity.status, // ๐Ÿ‘ˆ ๆŠŠ Room ๅ„ฒๅญ˜็š„็‹€ๆ…‹ๅ€’ๅ‡บไพ†็ตฆ UI + reactions = entity.reactions ) } @@ -94,7 +95,8 @@ class ChatRoomsRepository @Inject constructor( isEdited = networkMessage.isEdited, isDeleted = networkMessage.isDeleted, replyToId = networkMessage.replyToId, - status = MessageStatus.SUCCESS // ๅพŒ็ซฏไพ†็š„้ƒฝๆ˜ฏ็œŸ็š„็™ผ้€ๆˆๅŠŸ็š„ + status = MessageStatus.SUCCESS, + reactions = networkMessage.reactions ) messageDao.insertOrUpdate(entity) } @@ -125,7 +127,8 @@ class ChatRoomsRepository @Inject constructor( isEdited = false, isDeleted = false, replyToId = replyToId, - status = MessageStatus.SENDING // ๐Ÿ‘ˆ ็•ซ้ข้ฆฌไธŠๅ‘ˆ็พๅŠ้€ๆ˜Žๆทก็ฐ่‰ฒ๏ผ + status = MessageStatus.SENDING, + reactions = emptyList() ) messageDao.insertOrUpdate(tempMessageEntity) @@ -150,7 +153,8 @@ class ChatRoomsRepository @Inject constructor( isEdited = body.isEdited, isDeleted = body.isDeleted, replyToId = body.replyToId, - status = MessageStatus.SUCCESS + status = MessageStatus.SUCCESS, + reactions = body.reactions ) messageDao.insertOrUpdate(successEntity) Result.success(Unit) @@ -317,33 +321,6 @@ class ChatRoomsRepository @Inject constructor( } } - // ๅ–ๅพ—้ปžๆ“Š็‰นๅฎš่จŠๆฏไธญๆŸๅ€‹ Emoji ็š„ไฝฟ็”จ่€…ๆธ…ๅ–ฎ - suspend fun getMessageReactionUsers( - roomId: String, - messageId: String, - emoji: String - ): Result { - return try { - // ๅ‘ผๅซ API - val response = api.getMessageReactionUsers(roomId, messageId, emoji) - - if (response.isSuccessful) { - val body = response.body() - if (body != null) { - Result.success(body) - } else { - Result.failure(Exception("ๅ›žๆ‡‰ๆˆๅŠŸไฝ†ๅ›žๆ‡‰่บซ้ซ”็‚บ็ฉบ (Empty response body)")) - } - } else { - val errorMsg = response.errorBody()?.string() ?: "ๆœช็Ÿฅ้Œฏ่ชค" - Result.failure(Exception("ๅ–ๅพ—ๅๆ‡‰ไฝฟ็”จ่€…ๅคฑๆ•—๏ผŒ้Œฏ่ชค็ขผ: ${response.code()}, ่จŠๆฏ: $errorMsg")) - } - } catch (e: Exception) { - // ๆ•ๆ‰็ถฒ่ทฏๆ–ท็ทš็ญ‰็•ฐๅธธ็‹€ๆณ - Result.failure(e) - } - } - // ๆ–ฐๅขž่จŠๆฏ็š„ Emoji ๅๆ‡‰ suspend fun addMessageReaction( roomId: String, diff --git a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt index 8e20409..8ad35f2 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/UI/Detail/Message_Messaging.kt @@ -113,9 +113,6 @@ fun MessageMessaging( //reply function val replyingMessage by viewModel.replyingMessage.collectAsStateWithLifecycle() - // ๐Ÿ’ก 1. ๅ–ๅพ— ViewModel ่ฃก็š„ Reaction ็‹€ๆ…‹ - val reactionState by viewModel.reactionUsersState.collectAsStateWithLifecycle() - //message that selected val actionMessage by viewModel.actionMessage.collectAsStateWithLifecycle() 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 index b02bff5..1f65148 100644 --- 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 @@ -7,6 +7,7 @@ import androidx.room.OnConflictStrategy import androidx.room.PrimaryKey import kotlinx.coroutines.flow.Flow import androidx.room.Query +import com.example.login_v3.data.api.api_class.Reaction enum class MessageStatus { SENDING, SUCCESS, FAILED } @@ -21,7 +22,8 @@ data class MessageEntity( val isEdited: Boolean, // ๐Ÿ‘ˆ ๆ–ฐๅขž val isDeleted: Boolean, // ๐Ÿ‘ˆ ๆ–ฐๅขž val replyToId: String?, // ๐Ÿ‘ˆ ๆ–ฐๅขž - val status: MessageStatus // ๐Ÿ‘ˆ ๆจ‚่ง€ๆ›ดๆ–ฐ็‹€ๆ…‹ๆŽงๅˆถ (SENDING, SUCCESS, FAILED) + val status: MessageStatus, // ๐Ÿ‘ˆ ๆจ‚่ง€ๆ›ดๆ–ฐ็‹€ๆ…‹ๆŽงๅˆถ (SENDING, SUCCESS, FAILED) + val reactions: List? ) @Dao diff --git a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt index 987be4a..4897745 100644 --- a/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt +++ b/app/src/main/java/com/example/login_v3/home/Message/ViewModel/Detail/Message_Messaging_ViewModel.kt @@ -223,17 +223,6 @@ class ChatViewModel @Inject constructor( } } - private val _reactionUsersState = MutableStateFlow(ReactionUsersState.Idle) - val reactionUsersState: StateFlow = _reactionUsersState.asStateFlow() - - fun loadMessageReactionUsers(roomId: String, messageId: String, emoji: String) { - viewModelScope.launch { - _reactionUsersState.value = ReactionUsersState.Loading - repository.getMessageReactionUsers(roomId, messageId, emoji) - .onSuccess { response -> _reactionUsersState.value = ReactionUsersState.Success(response.users) } - .onFailure { error -> _reactionUsersState.value = ReactionUsersState.Error(error.message ?: "็„กๆณ•ๅ–ๅพ—ๆŒ‰่ฎšๅๅ–ฎ") } - } - } fun addMessageReaction(roomId: String, messageId: String, emoji: String) { viewModelScope.launch { @@ -255,6 +244,5 @@ class ChatViewModel @Inject constructor( } fun resetDeleteMessageState() { _deleteMessageState.value = DeleteMessageState.Idle } - fun resetReactionUsersState() { _reactionUsersState.value = ReactionUsersState.Idle } fun resetSendMessageState() { _sendMessageState.value = SendMessageState.Idle } } \ No newline at end of file