Восстановлены голосовые
This commit is contained in:
@@ -33,7 +33,7 @@ interface ChatApi {
|
||||
): List<MessageDto>
|
||||
|
||||
@POST("messages/chat/{chatId}")
|
||||
suspend fun sendMessage(@Path("chatId") chatId: String, @Body request: SendMessageRequest): MessageDto
|
||||
suspend fun sendMessage(@Path("chatId") chatId: String, @Body request: SendMessageRequest): String
|
||||
|
||||
@Multipart
|
||||
@POST("messages/upload")
|
||||
@@ -68,7 +68,7 @@ interface ChatApi {
|
||||
suspend fun deleteMessage(@Path("messageId") messageId: String, @Query("forEveryone") forEveryone: Boolean): retrofit2.Response<Unit>
|
||||
|
||||
@PUT("messages/{messageId}")
|
||||
suspend fun editMessage(@Path("messageId") messageId: String, @Body request: SendMessageRequest): MessageDto
|
||||
suspend fun editMessage(@Path("messageId") messageId: String, @Body request: SendMessageRequest): String
|
||||
}
|
||||
|
||||
data class CreatePersonalChatRequest(
|
||||
|
||||
@@ -75,9 +75,43 @@ class ChatRepositoryImpl @Inject constructor(
|
||||
replyToId = replyToId,
|
||||
forwardedFromId = forwardedFromId
|
||||
)
|
||||
android.util.Log.d("ChatRepoImpl", "sendMessage request: $request")
|
||||
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
|
||||
val userId = tokenManager.getUserId() ?: ""
|
||||
return api.sendMessage(chatId, request).toDomain(userId, baseUrl)
|
||||
return try {
|
||||
val messageId = api.sendMessage(chatId, request)
|
||||
android.util.Log.d("ChatRepoImpl", "sendMessage response: $messageId")
|
||||
|
||||
// Поскольку сервер вернул только ID, создаем заглушку Message.
|
||||
// Настоящее сообщение придет через SignalR.
|
||||
Message(
|
||||
id = messageId,
|
||||
chatId = chatId,
|
||||
senderId = userId,
|
||||
senderName = "", // Будет обновлено через SignalR
|
||||
content = content,
|
||||
sequenceId = 0,
|
||||
createdAt = java.time.ZonedDateTime.now().toString(),
|
||||
media = attachments?.map {
|
||||
chats.domain.model.Media(
|
||||
id = java.util.UUID.randomUUID().toString(),
|
||||
type = it.type,
|
||||
url = it.url,
|
||||
filename = it.fileName,
|
||||
size = it.fileSize
|
||||
)
|
||||
} ?: emptyList(),
|
||||
mediaType = when(type) {
|
||||
"image" -> chats.domain.model.MediaType.IMAGE
|
||||
"video" -> chats.domain.model.MediaType.VIDEO
|
||||
"audio", "voice" -> chats.domain.model.MediaType.AUDIO
|
||||
else -> chats.domain.model.MediaType.TEXT
|
||||
}
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
android.util.Log.e("ChatRepoImpl", "sendMessage error", e)
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun addReaction(messageId: String, emoji: String) {
|
||||
@@ -145,7 +179,16 @@ class ChatRepositoryImpl @Inject constructor(
|
||||
override suspend fun editMessage(messageId: String, content: String): Message {
|
||||
val request = SendMessageRequest(content = content)
|
||||
val currentUserId = tokenManager.getUserId() ?: ""
|
||||
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
|
||||
return api.editMessage(messageId, request).toDomain(currentUserId, baseUrl)
|
||||
val returnedId = api.editMessage(messageId, request)
|
||||
|
||||
return Message(
|
||||
id = returnedId,
|
||||
chatId = "",
|
||||
senderId = currentUserId,
|
||||
senderName = "",
|
||||
content = content,
|
||||
sequenceId = 0,
|
||||
createdAt = java.time.ZonedDateTime.now().toString()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,21 @@ fun ChatDto.toDomain(currentUserId: String, baseUrl: String): Chat {
|
||||
}
|
||||
|
||||
fun MessageDto.toDomain(currentUserId: String, baseUrl: String): Message {
|
||||
val firstMedia = media.firstOrNull()
|
||||
val isVoiceFromFilename = firstMedia?.filename?.endsWith(".mp3", ignoreCase = true) == true ||
|
||||
firstMedia?.filename?.startsWith("voice_", ignoreCase = true) == true
|
||||
|
||||
val domainMediaType = when (type) {
|
||||
"gif" -> MediaType.GIF
|
||||
"image", "photo" -> MediaType.IMAGE
|
||||
"video" -> MediaType.VIDEO
|
||||
"audio", "voice" -> MediaType.AUDIO
|
||||
"file" -> MediaType.FILE
|
||||
else -> when (media.firstOrNull()?.type) {
|
||||
"file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE
|
||||
else -> when (firstMedia?.type) {
|
||||
"image", "photo" -> MediaType.IMAGE
|
||||
"video" -> MediaType.VIDEO
|
||||
"audio", "voice" -> MediaType.AUDIO
|
||||
"file" -> MediaType.FILE
|
||||
"file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE
|
||||
else -> MediaType.TEXT
|
||||
}
|
||||
}
|
||||
@@ -51,7 +55,7 @@ fun MessageDto.toDomain(currentUserId: String, baseUrl: String): Message {
|
||||
media = media.map {
|
||||
chats.domain.model.Media(
|
||||
id = it.id ?: java.util.UUID.randomUUID().toString(),
|
||||
type = it.type ?: "unknown",
|
||||
type = if (isVoiceFromFilename) "voice" else (it.type ?: "unknown"),
|
||||
url = (it.url ?: "").ensureAbsoluteUrl(baseUrl),
|
||||
filename = it.filename,
|
||||
size = it.size,
|
||||
|
||||
Reference in New Issue
Block a user