feat: implement delivery status updates and enhance file size limit for uploads

This commit is contained in:
2026-02-06 03:17:22 +05:00
parent 0bd8cb39ab
commit dcc719ec56
7 changed files with 115 additions and 23 deletions

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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
}
)