From b20ef6e08f8905936d2be643be49da586a360138 Mon Sep 17 00:00:00 2001 From: benya Date: Sun, 5 Apr 2026 15:26:56 +0300 Subject: [PATCH] fix: prevent unknown-user banner flicker fix: wait for private chat relationship resolution before showing the add-contact banner --- .../java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt | 1 + .../ru/daemonlord/messenger/ui/chat/ChatViewModel.kt | 10 ++++++++++ .../ru/daemonlord/messenger/ui/chat/MessageUiState.kt | 1 + 3 files changed, 12 insertions(+) diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt index 7a81384..4073f13 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatScreen.kt @@ -603,6 +603,7 @@ private fun ChatScreen( val isPrivateChat = state.chatType.equals("private", ignoreCase = true) val showUnknownPrivateChatBanner = isPrivateChat && state.counterpartUserId != null && + state.isCounterpartRelationshipResolved && !state.isCounterpartContact && !state.isCounterpartBlocked val canShowMembersTab = state.chatType.equals("group", ignoreCase = true) || diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatViewModel.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatViewModel.kt index ce869f5..c298284 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatViewModel.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/ChatViewModel.kt @@ -778,6 +778,11 @@ class ChatViewModel @Inject constructor( it.copy( chatType = chat.type, counterpartUserId = chat.counterpartUserId, + isCounterpartRelationshipResolved = if (chat.type.equals("private", ignoreCase = true) && chat.counterpartUserId != null) { + it.isCounterpartRelationshipResolved + } else { + false + }, chatRole = role, chatMuted = chat.muted, chatTitle = chatTitle, @@ -819,6 +824,7 @@ class ChatViewModel @Inject constructor( is AppResult.Success -> { _uiState.update { it.copy( + isCounterpartRelationshipResolved = true, isCounterpartContact = true, isCounterpartBlocked = false, errorMessage = null, @@ -842,6 +848,7 @@ class ChatViewModel @Inject constructor( is AppResult.Success -> { _uiState.update { it.copy( + isCounterpartRelationshipResolved = true, isCounterpartContact = false, isCounterpartBlocked = true, errorMessage = null, @@ -964,6 +971,7 @@ class ChatViewModel @Inject constructor( privateChatRelationKey = null _uiState.update { it.copy( + isCounterpartRelationshipResolved = false, isCounterpartContact = false, isCounterpartBlocked = false, ) @@ -972,6 +980,7 @@ class ChatViewModel @Inject constructor( } if (!force && privateChatRelationKey == counterpartUserId) return privateChatRelationKey = counterpartUserId + _uiState.update { it.copy(isCounterpartRelationshipResolved = false) } viewModelScope.launch { val contactsResult = accountRepository.listContacts() val blockedResult = accountRepository.listBlockedUsers() @@ -979,6 +988,7 @@ class ChatViewModel @Inject constructor( val isBlocked = (blockedResult as? AppResult.Success)?.data?.any { it.id == counterpartUserId } == true _uiState.update { it.copy( + isCounterpartRelationshipResolved = true, isCounterpartContact = isContact, isCounterpartBlocked = isBlocked, ) diff --git a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/MessageUiState.kt b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/MessageUiState.kt index a1c82be..25d94be 100644 --- a/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/MessageUiState.kt +++ b/android/app/src/main/java/ru/daemonlord/messenger/ui/chat/MessageUiState.kt @@ -22,6 +22,7 @@ data class MessageUiState( val chatRole: String? = null, val chatMuted: Boolean = false, val chatUnreadCount: Int = 0, + val isCounterpartRelationshipResolved: Boolean = false, val isCounterpartContact: Boolean = false, val isCounterpartBlocked: Boolean = false, val chatMembers: List = emptyList(),