From 7048da2e203cc9577964788a9a1b61ef024701d5 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 23 Oct 2023 09:31:32 +0100 Subject: [PATCH] Fix issue where text is cleared when cancelling a reply (#1617) --- changelog.d/1617.bugfix | 1 + .../messages/impl/MessagesStateProvider.kt | 2 +- .../MessageComposerContextImpl.kt | 2 +- .../MessageComposerPresenter.kt | 10 +++--- .../MessageComposerStateProvider.kt | 2 +- .../MessageComposerPresenterTest.kt | 33 ++++++++++++++++--- .../test/MessageComposerContextFake.kt | 2 +- .../libraries/textcomposer/TextComposer.kt | 14 ++++---- .../textcomposer/components/SendButton.kt | 2 +- .../textcomposer/model/MessageComposerMode.kt | 2 +- 10 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 changelog.d/1617.bugfix diff --git a/changelog.d/1617.bugfix b/changelog.d/1617.bugfix new file mode 100644 index 0000000000..8beee812e5 --- /dev/null +++ b/changelog.d/1617.bugfix @@ -0,0 +1 @@ +Fix issue where text is cleared when cancelling a reply \ No newline at end of file diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 4222a0889d..249c4b487e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -59,7 +59,7 @@ fun aMessagesState() = MessagesState( composerState = aMessageComposerState().copy( richTextEditorState = RichTextEditorState("Hello", initialFocus = true), isFullScreen = false, - mode = MessageComposerMode.Normal("Hello"), + mode = MessageComposerMode.Normal, ), voiceMessageComposerState = aVoiceMessageComposerState(), timelineState = aTimelineState().copy( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt index c9a491d8a3..2353285499 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt @@ -29,6 +29,6 @@ import javax.inject.Inject @SingleIn(RoomScope::class) @ContributesBinding(RoomScope::class) class MessageComposerContextImpl @Inject constructor() : MessageComposerContext { - override var composerMode: MessageComposerMode by mutableStateOf(MessageComposerMode.Normal("")) + override var composerMode: MessageComposerMode by mutableStateOf(MessageComposerMode.Normal) internal set } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index e4a8d50cb8..3857600e58 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -155,10 +155,12 @@ class MessageComposerPresenter @Inject constructor( when (event) { MessageComposerEvents.ToggleFullScreenState -> isFullScreen.value = !isFullScreen.value MessageComposerEvents.CloseSpecialMode -> { - localCoroutineScope.launch { - richTextEditorState.setHtml("") + if (messageComposerContext.composerMode is MessageComposerMode.Edit) { + localCoroutineScope.launch { + richTextEditorState.setHtml("") + } } - messageComposerContext.composerMode = MessageComposerMode.Normal("") + messageComposerContext.composerMode = MessageComposerMode.Normal } is MessageComposerEvents.SendMessage -> appCoroutineScope.sendMessage( message = event.message, @@ -253,7 +255,7 @@ class MessageComposerPresenter @Inject constructor( val capturedMode = messageComposerContext.composerMode // Reset composer right away richTextEditorState.setHtml("") - updateComposerMode(MessageComposerMode.Normal("")) + updateComposerMode(MessageComposerMode.Normal) when (capturedMode) { is MessageComposerMode.Normal -> room.sendMessage(body = message.markdown, htmlBody = message.html) is MessageComposerMode.Edit -> { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt index 7dbe413e83..76f40a1969 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt @@ -30,7 +30,7 @@ open class MessageComposerStateProvider : PreviewParameterProvider.backToNormalMode(state: MessageComposerState, skipCount: Int = 0) { + private suspend fun ReceiveTurbine.backToNormalMode(state: MessageComposerState, skipCount: Int = 0): MessageComposerState { state.eventSink.invoke(MessageComposerEvents.CloseSpecialMode) skipItems(skipCount) val normalState = awaitItem() - assertThat(normalState.mode).isEqualTo(MessageComposerMode.Normal("")) - assertThat(normalState.richTextEditorState.messageHtml).isEqualTo("") + assertThat(normalState.mode).isEqualTo(MessageComposerMode.Normal) + return normalState } private fun createPresenter( diff --git a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt index 0ae604004d..03af64e071 100644 --- a/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt +++ b/features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt @@ -20,5 +20,5 @@ import io.element.android.features.messages.api.MessageComposerContext import io.element.android.libraries.textcomposer.model.MessageComposerMode class MessageComposerContextFake( - override var composerMode: MessageComposerMode = MessageComposerMode.Normal(null) + override var composerMode: MessageComposerMode = MessageComposerMode.Normal ) : MessageComposerContext diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 18246f1ac4..911cebb142 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -483,7 +483,7 @@ internal fun TextComposerSimplePreview() = ElementPreview { RichTextEditorState("", initialFocus = true), voiceMessageState = VoiceMessageState.Idle, onSendMessage = {}, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, onResetComposerMode = {}, enableTextFormatting = true, enableVoiceMessages = true, @@ -493,7 +493,7 @@ internal fun TextComposerSimplePreview() = ElementPreview { RichTextEditorState("A message", initialFocus = true), voiceMessageState = VoiceMessageState.Idle, onSendMessage = {}, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, onResetComposerMode = {}, enableTextFormatting = true, enableVoiceMessages = true, @@ -506,7 +506,7 @@ internal fun TextComposerSimplePreview() = ElementPreview { ), voiceMessageState = VoiceMessageState.Idle, onSendMessage = {}, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, onResetComposerMode = {}, enableTextFormatting = true, enableVoiceMessages = true, @@ -516,7 +516,7 @@ internal fun TextComposerSimplePreview() = ElementPreview { RichTextEditorState("A message without focus", initialFocus = false), voiceMessageState = VoiceMessageState.Idle, onSendMessage = {}, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, onResetComposerMode = {}, enableTextFormatting = true, enableVoiceMessages = true, @@ -533,7 +533,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview { RichTextEditorState("", initialFocus = false), voiceMessageState = VoiceMessageState.Idle, showTextFormatting = true, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, enableTextFormatting = true, enableVoiceMessages = true, ) @@ -542,7 +542,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview { RichTextEditorState("A message", initialFocus = false), voiceMessageState = VoiceMessageState.Idle, showTextFormatting = true, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, enableTextFormatting = true, enableVoiceMessages = true, ) @@ -551,7 +551,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview { RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false), voiceMessageState = VoiceMessageState.Idle, showTextFormatting = true, - composerMode = MessageComposerMode.Normal(""), + composerMode = MessageComposerMode.Normal, enableTextFormatting = true, enableVoiceMessages = true, ) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt index 8dc1a4706b..be258f07de 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt @@ -93,7 +93,7 @@ internal fun SendButton( @PreviewsDayNight @Composable internal fun SendButtonPreview() = ElementPreview { - val normalMode = MessageComposerMode.Normal("") + val normalMode = MessageComposerMode.Normal val editMode = MessageComposerMode.Edit(null, "", null) Row { SendButton(canSendMessage = true, onClick = {}, composerMode = normalMode) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt index 49ce0ddb6e..34ab1641f2 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt @@ -24,7 +24,7 @@ import kotlinx.parcelize.Parcelize sealed interface MessageComposerMode : Parcelable { @Parcelize - data class Normal(val content: CharSequence?) : MessageComposerMode + data object Normal: MessageComposerMode sealed class Special(open val eventId: EventId?, open val defaultContent: String) : MessageComposerMode