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
|
val context = LocalContext.current
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
viewModel.startListening()
|
viewModel.startListening(createUiCallbackListener = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load/switch channel
|
// Load/switch channel
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue