fix(regression/cs2): issue in which ui callbacks fire multiply

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2024-06-03 19:54:23 +02:00
parent 7fca8e503c
commit d119f7b47f
2 changed files with 37 additions and 31 deletions

View File

@ -170,7 +170,7 @@ fun ChannelScreen(
val context = LocalContext.current val context = LocalContext.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
viewModel.startListening() viewModel.startListening(createUiCallbackListener = true)
} }
// Load/switch channel // Load/switch channel

View File

@ -444,7 +444,7 @@ class ChannelScreenViewModel @Inject constructor(
ackChannel(channel?.id ?: return, messageId) ackChannel(channel?.id ?: return, messageId)
} }
suspend fun startListening() { suspend fun startListening(createUiCallbackListener: Boolean = true) {
viewModelScope.launch { viewModelScope.launch {
withContext(RevoltAPI.realtimeContext) { withContext(RevoltAPI.realtimeContext) {
flow { flow {
@ -633,7 +633,7 @@ class ChannelScreenViewModel @Inject constructor(
is RealtimeSocketFrames.Reconnected -> { is RealtimeSocketFrames.Reconnected -> {
Log.d("ChannelScreen", "Reconnected to WS.") Log.d("ChannelScreen", "Reconnected to WS.")
loadMessages(50, ignoreExisting = true) loadMessages(50, ignoreExisting = true)
startListening() startListening(createUiCallbackListener = false)
} }
} }
}.catch { }.catch {
@ -641,37 +641,43 @@ class ChannelScreenViewModel @Inject constructor(
}.launchIn(this) }.launchIn(this)
} }
} }
viewModelScope.launch {
withContext(Dispatchers.Main) {
UiCallbacks.uiCallbackFlow.onEach {
Log.d("ChannelScreen", "Received UI callback: $it")
when (it) { if (createUiCallbackListener) {
is UiCallback.ReplyToMessage -> { viewModelScope.launch {
val message = items.find { m -> withContext(Dispatchers.Main) {
m is ChannelScreenItem.RegularMessage && m.message.id == it.messageId UiCallbacks.uiCallbackFlow.onEach {
} as? ChannelScreenItem.RegularMessage ?: return@onEach Log.d("ChannelScreen", "Received UI callback: $it")
val shouldMention = kvStorage.getBoolean("mentionOnReply") ?: false when (it) {
draftReplyTo.add( is UiCallback.ReplyToMessage -> {
SendMessageReply(message.message.id ?: return@onEach, shouldMention) 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()
}
} }
}.catch {
is UiCallback.EditMessage -> { Log.e("ChannelScreen", "Failed to receive UI callback", it)
editingMessage = it.messageId }.launchIn(this)
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)
} }
} }
} }