feat: Implement special handling for Saved Messages, including dedicated methods for retrieval, display, and dialog updates
This commit is contained in:
@@ -158,7 +158,11 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
val timestamp = System.currentTimeMillis()
|
||||
val dialogKey = getDialogKey(toPublicKey)
|
||||
|
||||
// 📁 Проверяем является ли это Saved Messages
|
||||
val isSavedMessages = (account == toPublicKey)
|
||||
|
||||
// 1. Создаем оптимистичное сообщение
|
||||
// 📁 Для saved messages - сразу DELIVERED и прочитано
|
||||
val optimisticMessage = Message(
|
||||
messageId = messageId,
|
||||
fromPublicKey = account,
|
||||
@@ -166,8 +170,8 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
content = text.trim(),
|
||||
timestamp = timestamp,
|
||||
isFromMe = true,
|
||||
isRead = account == toPublicKey, // Если сам себе - сразу прочитано
|
||||
deliveryStatus = DeliveryStatus.WAITING,
|
||||
isRead = isSavedMessages, // 📁 Если сам себе - сразу прочитано
|
||||
deliveryStatus = if (isSavedMessages) DeliveryStatus.DELIVERED else DeliveryStatus.WAITING, // 📁 Для saved messages - сразу доставлено
|
||||
attachments = attachments,
|
||||
replyToMessageId = replyToMessageId
|
||||
)
|
||||
@@ -194,6 +198,7 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
val exists = messageDao.messageExists(account, messageId)
|
||||
if (!exists) {
|
||||
// Сохраняем в БД только если сообщения нет
|
||||
// 📁 Для saved messages - сразу read=1 и delivered=DELIVERED
|
||||
val entity = MessageEntity(
|
||||
account = account,
|
||||
fromPublicKey = account,
|
||||
@@ -201,9 +206,9 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
content = encryptedContent,
|
||||
timestamp = timestamp,
|
||||
chachaKey = encryptedKey,
|
||||
read = if (account == toPublicKey) 1 else 0,
|
||||
read = if (isSavedMessages) 1 else 0,
|
||||
fromMe = 1,
|
||||
delivered = DeliveryStatus.WAITING.value,
|
||||
delivered = if (isSavedMessages) DeliveryStatus.DELIVERED.value else DeliveryStatus.WAITING.value,
|
||||
messageId = messageId,
|
||||
plainMessage = encryptedPlainMessage, // 🔒 Зашифрованный текст
|
||||
attachments = attachmentsJson,
|
||||
@@ -219,7 +224,13 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
// 🔥 Отмечаем что я отправлял сообщения в этот диалог (перемещает из requests в chats)
|
||||
val updatedRows = dialogDao.markIHaveSent(account, toPublicKey)
|
||||
|
||||
// Отправляем пакет
|
||||
// 📁 НЕ отправляем пакет на сервер для saved messages!
|
||||
// Как в Архиве: if(publicKey == opponentPublicKey) return;
|
||||
if (isSavedMessages) {
|
||||
return@launch // Для saved messages - только локальное сохранение, без отправки на сервер
|
||||
}
|
||||
|
||||
// Отправляем пакет (только для обычных диалогов)
|
||||
val packet = PacketMessage().apply {
|
||||
this.fromPublicKey = account
|
||||
this.toPublicKey = toPublicKey
|
||||
@@ -375,6 +386,7 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
/**
|
||||
* Отметить диалог как прочитанный
|
||||
* 🔥 После обновления messages обновляем диалог через updateDialogFromMessages
|
||||
* 📁 SAVED MESSAGES: Использует специальный метод для saved messages
|
||||
*/
|
||||
suspend fun markDialogAsRead(opponentKey: String) {
|
||||
val account = currentAccount ?: return
|
||||
@@ -385,17 +397,28 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
|
||||
// 🔥 КРИТИЧНО: Пересчитываем счетчики из таблицы messages
|
||||
// чтобы unread_count обновился моментально
|
||||
dialogDao.updateDialogFromMessages(account, opponentKey)
|
||||
// 📁 Используем специальный метод для saved messages
|
||||
if (opponentKey == account) {
|
||||
dialogDao.updateSavedMessagesDialogFromMessages(account)
|
||||
} else {
|
||||
dialogDao.updateDialogFromMessages(account, opponentKey)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Отправить уведомление "печатает"
|
||||
* 📁 Для Saved Messages - не отправляем
|
||||
*/
|
||||
fun sendTyping(toPublicKey: String) {
|
||||
val account = currentAccount ?: return
|
||||
val privateKey = currentPrivateKey ?: return
|
||||
|
||||
// 📁 Для Saved Messages - не отправляем typing
|
||||
if (account == toPublicKey) {
|
||||
return
|
||||
}
|
||||
|
||||
scope.launch {
|
||||
val packet = PacketTyping().apply {
|
||||
this.fromPublicKey = account
|
||||
@@ -435,8 +458,17 @@ class MessageRepository private constructor(private val context: Context) {
|
||||
// Private helpers
|
||||
// ===============================
|
||||
|
||||
/**
|
||||
* Получить ключ диалога для группировки сообщений
|
||||
* 📁 SAVED MESSAGES: Для saved messages (account == opponentKey) возвращает просто account
|
||||
*/
|
||||
private fun getDialogKey(opponentKey: String): String {
|
||||
val account = currentAccount ?: return opponentKey
|
||||
// Для saved messages dialog_key = просто publicKey
|
||||
if (account == opponentKey) {
|
||||
return account
|
||||
}
|
||||
// Для обычных диалогов - сортируем ключи
|
||||
return if (account < opponentKey) "$account:$opponentKey"
|
||||
else "$opponentKey:$account"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user