Вторая часть по кэшу
This commit is contained in:
@@ -594,35 +594,12 @@ class ChatDetailViewModel @Inject constructor(
|
||||
val replyToId = _state.value.replyingMessage?.id
|
||||
_state.update { it.copy(replyingMessage = null) }
|
||||
|
||||
val tempId = "temp_voice_${System.currentTimeMillis()}"
|
||||
val userId = getCurrentUserId()
|
||||
|
||||
val tempMessage = Message(
|
||||
id = tempId,
|
||||
chatId = chatId,
|
||||
senderId = userId,
|
||||
content = null,
|
||||
createdAt = java.util.Date().toString(),
|
||||
mediaType = chats.domain.model.MediaType.AUDIO,
|
||||
media = emptyList(),
|
||||
senderName = "Вы",
|
||||
senderAvatar = null,
|
||||
reactions = emptyMap(),
|
||||
isRead = false,
|
||||
sequenceId = 0
|
||||
)
|
||||
|
||||
// Добавляем временное сообщение в стейт для индикации отправки
|
||||
_state.update { it.copy(messages = listOf(tempMessage) + it.messages) }
|
||||
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
android.util.Log.d("ChatDetailVM", "Starting voice upload...")
|
||||
// 1. Upload the audio file
|
||||
val url = repository.uploadMedia(file)
|
||||
android.util.Log.d("ChatDetailVM", "Voice upload successful, url: $url")
|
||||
|
||||
// 2. Send the message with the attachment
|
||||
val attachment = chats.data.remote.api.AttachmentRequest(
|
||||
type = "voice",
|
||||
url = url,
|
||||
@@ -631,34 +608,18 @@ class ChatDetailViewModel @Inject constructor(
|
||||
)
|
||||
|
||||
android.util.Log.d("ChatDetailVM", "Sending message with voice attachment...")
|
||||
val sentMessage = repository.sendMessage(
|
||||
repository.sendMessage(
|
||||
chatId = chatId,
|
||||
content = null,
|
||||
type = "media",
|
||||
attachments = listOf(attachment),
|
||||
replyToId = replyToId
|
||||
)
|
||||
android.util.Log.d("ChatDetailVM", "Voice message sent successfully: ${sentMessage.id}")
|
||||
|
||||
// Заменяем временное сообщение на настоящее
|
||||
_state.update { currentState ->
|
||||
val filtered = currentState.messages.filter { it.id != tempId }
|
||||
// Избегаем дубликатов, если SignalR уже добавил сообщение
|
||||
if (filtered.any { it.id == sentMessage.id }) {
|
||||
currentState.copy(messages = filtered)
|
||||
} else {
|
||||
currentState.copy(messages = listOf(sentMessage) + filtered)
|
||||
}
|
||||
}
|
||||
// Сообщение автоматически появится в UI через Flow из Room
|
||||
android.util.Log.d("ChatDetailVM", "Voice message queued successfully")
|
||||
} catch (e: Exception) {
|
||||
android.util.Log.e("ChatDetailVM", "Error sending voice message", e)
|
||||
// Удаляем временное сообщение и показываем ошибку
|
||||
_state.update { currentState ->
|
||||
currentState.copy(
|
||||
messages = currentState.messages.filter { it.id != tempId },
|
||||
error = "Ошибка отправки голосового: ${e.localizedMessage}"
|
||||
)
|
||||
}
|
||||
_state.update { it.copy(error = "Ошибка отправки голосового: ${e.localizedMessage}") }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -776,28 +737,6 @@ class ChatDetailViewModel @Inject constructor(
|
||||
val replyToId = _state.value.replyingMessage?.id
|
||||
_state.update { it.copy(replyingMessage = null) }
|
||||
|
||||
val tempId = "temp_gif_${System.currentTimeMillis()}"
|
||||
val userId = getCurrentUserId()
|
||||
|
||||
val tempMessage = Message(
|
||||
id = tempId,
|
||||
chatId = chatId,
|
||||
senderId = userId,
|
||||
content = url,
|
||||
createdAt = java.util.Date().toString(),
|
||||
mediaType = chats.domain.model.MediaType.IMAGE, // We map GIF to IMAGE for rendering
|
||||
media = listOf(chats.domain.model.Media(url = url, type = "image", id = "temp_media")),
|
||||
senderName = "Вы",
|
||||
senderAvatar = null,
|
||||
reactions = emptyMap(),
|
||||
isRead = false,
|
||||
sequenceId = 0
|
||||
)
|
||||
|
||||
viewModelScope.launch {
|
||||
repository.saveMessage(tempMessage)
|
||||
}
|
||||
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
val attachment = chats.data.remote.api.AttachmentRequest(
|
||||
@@ -806,10 +745,14 @@ class ChatDetailViewModel @Inject constructor(
|
||||
fileName = "gif.gif",
|
||||
fileSize = 0
|
||||
)
|
||||
val sentMessage = repository.sendMessage(chatId, null, "image", listOf(attachment), replyToId)
|
||||
|
||||
repository.deleteLocalMessage(tempId)
|
||||
repository.saveMessage(sentMessage)
|
||||
repository.sendMessage(
|
||||
chatId = chatId,
|
||||
content = null,
|
||||
type = "image",
|
||||
attachments = listOf(attachment),
|
||||
replyToId = replyToId
|
||||
)
|
||||
// Сообщение автоматически появится в UI через Flow из Room
|
||||
|
||||
// Add to recent
|
||||
val allGifs = _state.value.trendingGifs + _state.value.searchedGifs + _state.value.recentGifs
|
||||
@@ -828,7 +771,6 @@ class ChatDetailViewModel @Inject constructor(
|
||||
_state.update { it.copy(recentGifs = newList) }
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
repository.deleteLocalMessage(tempId)
|
||||
_state.update { it.copy(error = e.localizedMessage) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user