feat: implement delivery status updates and enhance file size limit for uploads
This commit is contained in:
@@ -255,7 +255,11 @@ fun ChatDetailScreen(
|
||||
|
||||
// Проверяем размер файла
|
||||
if (fileSize > MediaUtils.MAX_FILE_SIZE_MB * 1024 * 1024) {
|
||||
// TODO: Показать ошибку
|
||||
android.widget.Toast.makeText(
|
||||
context,
|
||||
"Файл слишком большой (макс. ${MediaUtils.MAX_FILE_SIZE_MB} МБ)",
|
||||
android.widget.Toast.LENGTH_LONG
|
||||
).show()
|
||||
return@launch
|
||||
}
|
||||
|
||||
|
||||
@@ -189,6 +189,7 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
||||
init {
|
||||
setupPacketListeners()
|
||||
setupNewMessageListener()
|
||||
setupDeliveryStatusListener()
|
||||
}
|
||||
|
||||
// 🔥 Debounce для защиты от спама входящих сообщений
|
||||
@@ -316,10 +317,49 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 🔔 Подписка на события изменения статуса доставки
|
||||
* Обновляет UI когда сообщение доставлено или прочитано
|
||||
*/
|
||||
private fun setupDeliveryStatusListener() {
|
||||
viewModelScope.launch {
|
||||
messageRepository.deliveryStatusEvents.collect { update ->
|
||||
val account = myPublicKey ?: return@collect
|
||||
val opponent = opponentKey ?: return@collect
|
||||
val currentDialogKey = getDialogKey(account, opponent)
|
||||
|
||||
if (update.dialogKey == currentDialogKey) {
|
||||
when (update.status) {
|
||||
DeliveryStatus.DELIVERED -> {
|
||||
// Обновляем конкретное сообщение
|
||||
updateMessageStatus(update.messageId, MessageStatus.DELIVERED)
|
||||
}
|
||||
DeliveryStatus.READ -> {
|
||||
// Помечаем все исходящие как прочитанные
|
||||
markAllOutgoingAsRead()
|
||||
}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Помечает все исходящие сообщения как прочитанные
|
||||
*/
|
||||
private fun markAllOutgoingAsRead() {
|
||||
_messages.value = _messages.value.map { msg ->
|
||||
if (msg.isOutgoing && msg.status != MessageStatus.READ) {
|
||||
msg.copy(status = MessageStatus.READ)
|
||||
} else msg
|
||||
}
|
||||
updateCacheFromCurrentMessages()
|
||||
}
|
||||
|
||||
private fun setupPacketListeners() {
|
||||
// ✅ Обработчики 0x06, 0x07, 0x08 удалены - они обрабатываются ТОЛЬКО в ProtocolManager
|
||||
// Это предотвращает дублирование сообщений и статусов при навигации между чатами
|
||||
// ChatViewModel получает обновления через messageCache Flow из MessageRepository
|
||||
// ✅ Обработчики 0x06, 0x07, 0x08 обрабатываются в ProtocolManager → MessageRepository
|
||||
// ChatViewModel получает обновления через deliveryStatusEvents SharedFlow
|
||||
|
||||
// Typing - нужен здесь для UI текущего чата
|
||||
ProtocolManager.waitPacket(0x0B, typingPacketHandler)
|
||||
|
||||
@@ -66,5 +66,6 @@ fun Message.toChatMessage() = ChatMessage(
|
||||
DeliveryStatus.WAITING -> MessageStatus.SENDING
|
||||
DeliveryStatus.DELIVERED -> if (isRead) MessageStatus.READ else MessageStatus.DELIVERED
|
||||
DeliveryStatus.ERROR -> MessageStatus.SENT
|
||||
DeliveryStatus.READ -> MessageStatus.READ
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user