From d119f7b47f94676c1f739e84376b8e15d42f4fac Mon Sep 17 00:00:00 2001 From: Infi Date: Mon, 3 Jun 2024 19:54:23 +0200 Subject: [PATCH] fix(regression/cs2): issue in which ui callbacks fire multiply Signed-off-by: Infi --- .../chat/views/channel/ChannelScreen.kt | 2 +- .../views/channel/ChannelScreenViewModel.kt | 66 ++++++++++--------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt index 1ee299da..c134bcfa 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt @@ -170,7 +170,7 @@ fun ChannelScreen( val context = LocalContext.current LaunchedEffect(Unit) { - viewModel.startListening() + viewModel.startListening(createUiCallbackListener = true) } // Load/switch channel diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt index 339afdb5..e365206b 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -444,7 +444,7 @@ class ChannelScreenViewModel @Inject constructor( ackChannel(channel?.id ?: return, messageId) } - suspend fun startListening() { + suspend fun startListening(createUiCallbackListener: Boolean = true) { viewModelScope.launch { withContext(RevoltAPI.realtimeContext) { flow { @@ -633,7 +633,7 @@ class ChannelScreenViewModel @Inject constructor( is RealtimeSocketFrames.Reconnected -> { Log.d("ChannelScreen", "Reconnected to WS.") loadMessages(50, ignoreExisting = true) - startListening() + startListening(createUiCallbackListener = false) } } }.catch { @@ -641,37 +641,43 @@ class ChannelScreenViewModel @Inject constructor( }.launchIn(this) } } - viewModelScope.launch { - withContext(Dispatchers.Main) { - UiCallbacks.uiCallbackFlow.onEach { - Log.d("ChannelScreen", "Received UI callback: $it") - when (it) { - is UiCallback.ReplyToMessage -> { - val message = items.find { m -> - m is ChannelScreenItem.RegularMessage && m.message.id == it.messageId - } as? ChannelScreenItem.RegularMessage ?: return@onEach + if (createUiCallbackListener) { + viewModelScope.launch { + withContext(Dispatchers.Main) { + UiCallbacks.uiCallbackFlow.onEach { + Log.d("ChannelScreen", "Received UI callback: $it") - val shouldMention = kvStorage.getBoolean("mentionOnReply") ?: false - draftReplyTo.add( - SendMessageReply(message.message.id ?: return@onEach, shouldMention) - ) + when (it) { + is UiCallback.ReplyToMessage -> { + val message = items.find { m -> + m is ChannelScreenItem.RegularMessage && m.message.id == it.messageId + } as? ChannelScreenItem.RegularMessage ?: return@onEach + + val shouldMention = kvStorage.getBoolean("mentionOnReply") ?: false + draftReplyTo.add( + SendMessageReply( + message.message.id ?: return@onEach, + shouldMention + ) + ) + } + + is UiCallback.EditMessage -> { + editingMessage = it.messageId + val message = items.find { m -> + m is ChannelScreenItem.RegularMessage && m.message.id == it.messageId + } as? ChannelScreenItem.RegularMessage ?: return@onEach + + putDraftContent(message.message.content ?: "") + this@ChannelScreenViewModel.draftAttachments.clear() + draftReplyTo.clear() + } } - - is UiCallback.EditMessage -> { - editingMessage = it.messageId - val message = items.find { m -> - m is ChannelScreenItem.RegularMessage && m.message.id == it.messageId - } as? ChannelScreenItem.RegularMessage ?: return@onEach - - putDraftContent(message.message.content ?: "") - this@ChannelScreenViewModel.draftAttachments.clear() - draftReplyTo.clear() - } - } - }.catch { - Log.e("ChannelScreen", "Failed to receive UI callback", it) - }.launchIn(this) + }.catch { + Log.e("ChannelScreen", "Failed to receive UI callback", it) + }.launchIn(this) + } } } }