fix(regression/cs2): issue in which ui callbacks fire multiply
Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
parent
7fca8e503c
commit
d119f7b47f
|
|
@ -170,7 +170,7 @@ fun ChannelScreen(
|
|||
val context = LocalContext.current
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
viewModel.startListening()
|
||||
viewModel.startListening(createUiCallbackListener = true)
|
||||
}
|
||||
|
||||
// Load/switch channel
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue