This commit is contained in:
Eric85710 2026-05-27 05:10:09 +08:00
parent ef57a7b440
commit bb096e8531
3 changed files with 56 additions and 29 deletions

View file

@ -110,4 +110,12 @@ interface TecnologiaApi {
@Path("room_id") roomId: String, @Path("room_id") roomId: String,
@Part file: MultipartBody.Part @Part file: MultipartBody.Part
): Response<Message> ): Response<Message>
//get emoji reaction
@GET("api/dm/{room_id}/messages/{msg_id}/reactions/{emoji}")
suspend fun getMessageReactionUsers(
@Path("room_id") roomId: String,
@Path("msg_id") msgId: String,
@Path("emoji") emoji: String
): Response<MessageReactionUsersResponse>
} }

View file

@ -51,18 +51,6 @@ data class LastMessage(
@Json(name = "forwarded_from_id") val forwardedFromId: String?, @Json(name = "forwarded_from_id") val forwardedFromId: String?,
@Json(name = "forwarded_from_room_id") val forwardedFromRoomId: String? @Json(name = "forwarded_from_room_id") val forwardedFromRoomId: String?
) )
@JsonClass(generateAdapter = true)
data class Attachment(
@Json(name = "filename") val filename: String,
@Json(name = "mime_type") val mimeType: String,
@Json(name = "size") val size: Long
)
@JsonClass(generateAdapter = true)
data class Reaction(
@Json(name = "emoji") val emoji: String = "",
@Json(name = "count") val count: Int = 0,
@Json(name = "me_reacted") val meReacted: Boolean = false
)
val Partner.fullContactAvatarUrl: Any val Partner.fullContactAvatarUrl: Any
get() = if (avatarUrl.isNullOrBlank()) { get() = if (avatarUrl.isNullOrBlank()) {
@ -76,6 +64,22 @@ val Partner.fullContactAvatarUrl: Any
//Message DM //Message DM
// 抽到最外層,讓 ChatRoom、LastMessage、Message 共同使用
@JsonClass(generateAdapter = true)
data class Attachment(
@Json(name = "filename") val filename: String,
@Json(name = "mime_type") val mimeType: String,
@Json(name = "size") val size: Long
)
@JsonClass(generateAdapter = true)
data class Reaction(
@Json(name = "emoji") val emoji: String = "",
@Json(name = "count") val count: Int = 0,
@Json(name = "me_reacted") val meReacted: Boolean = false
)
// --- Message DM 相關 ---
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)
data class MessageResponse( data class MessageResponse(
@Json(name = "has_more") val hasMore: Boolean, @Json(name = "has_more") val hasMore: Boolean,
@ -97,27 +101,14 @@ data class Message(
@Json(name = "is_edited") val isEdited: Boolean, @Json(name = "is_edited") val isEdited: Boolean,
@Json(name = "is_deleted") val isDeleted: Boolean, @Json(name = "is_deleted") val isDeleted: Boolean,
@Json(name = "reply_to_id") val replyToId: String? = null, @Json(name = "reply_to_id") val replyToId: String? = null,
@kotlin.jvm.Transient // 讓某些序列化工具忽略,Moshi 預設也會忽略沒有 @Json 的 var @kotlin.jvm.Transient
var repliedMessage: Message? = null, var repliedMessage: Message? = null,
@Json(name = "forwarded_from_id") val forwardedFromId: String? = null, @Json(name = "forwarded_from_id") val forwardedFromId: String? = null,
@Json(name = "forwarded_from_room_id") val forwardedFromRoomId: String? = null, @Json(name = "forwarded_from_room_id") val forwardedFromRoomId: String? = null,
@Json(name = "attachment") val attachment: Attachment? = null, @Json(name = "attachment") val attachment: Attachment? = null, // 直接使用外層的 Attachment
@Json(name = "reactions") val reactions: List<Reaction>? = emptyList() @Json(name = "reactions") val reactions: List<Reaction>? = emptyList() // 直接使用外層的 Reaction
){
@JsonClass(generateAdapter = true)
data class Attachment(
@Json(name = "filename") val filename: String,
@Json(name = "mime_type") val mimeType: String,
@Json(name = "size") val size: Long
) )
@JsonClass(generateAdapter = true)
data class Reaction(
@Json(name = "emoji") val emoji: String,
@Json(name = "count") val count: Int,
@Json(name = "me_reacted") val meReacted: Boolean
)
}
//send message //send message
@JsonClass(generateAdapter = true) @JsonClass(generateAdapter = true)

View file

@ -8,6 +8,7 @@ import android.provider.OpenableColumns
import com.example.login_v3.data.api.TecnologiaApi import com.example.login_v3.data.api.TecnologiaApi
import com.example.login_v3.data.api.api_class.ChatRoom import com.example.login_v3.data.api.api_class.ChatRoom
import com.example.login_v3.data.api.api_class.Message import com.example.login_v3.data.api.api_class.Message
import com.example.login_v3.data.api.api_class.MessageReactionUsersResponse
import com.example.login_v3.data.api.api_class.MessageResponse import com.example.login_v3.data.api.api_class.MessageResponse
import com.example.login_v3.data.api.api_class.RoomListResponse import com.example.login_v3.data.api.api_class.RoomListResponse
import com.example.login_v3.data.api.api_class.SendMessageRequest import com.example.login_v3.data.api.api_class.SendMessageRequest
@ -219,4 +220,31 @@ class ChatRoomsRepository @Inject constructor(
Result.failure(e) Result.failure(e)
} }
} }
// 取得點擊特定訊息中某個 Emoji 的使用者清單
suspend fun getMessageReactionUsers(
roomId: String,
messageId: String,
emoji: String
): Result<MessageReactionUsersResponse> {
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)
}
}
} }