Browse Source

Fix issue where text is cleared when cancelling a reply (#1617)

pull/1625/head
jonnyandrew 11 months ago committed by GitHub
parent
commit
7048da2e20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      changelog.d/1617.bugfix
  2. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt
  3. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt
  4. 10
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
  5. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt
  6. 33
      features/messages/impl/src/test/kotlin/io/element/android/features/messages/textcomposer/MessageComposerPresenterTest.kt
  7. 2
      features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt
  8. 14
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt
  9. 2
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt
  10. 2
      libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt

1
changelog.d/1617.bugfix

@ -0,0 +1 @@ @@ -0,0 +1 @@
Fix issue where text is cleared when cancelling a reply

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt

@ -59,7 +59,7 @@ fun aMessagesState() = MessagesState( @@ -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(

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerContextImpl.kt

@ -29,6 +29,6 @@ import javax.inject.Inject @@ -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
}

10
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt

@ -155,10 +155,12 @@ class MessageComposerPresenter @Inject constructor( @@ -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( @@ -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 -> {

2
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt

@ -30,7 +30,7 @@ open class MessageComposerStateProvider : PreviewParameterProvider<MessageCompos @@ -30,7 +30,7 @@ open class MessageComposerStateProvider : PreviewParameterProvider<MessageCompos
fun aMessageComposerState(
composerState: RichTextEditorState = RichTextEditorState(""),
isFullScreen: Boolean = false,
mode: MessageComposerMode = MessageComposerMode.Normal(content = ""),
mode: MessageComposerMode = MessageComposerMode.Normal,
showTextFormatting: Boolean = false,
showAttachmentSourcePicker: Boolean = false,
canShareLocation: Boolean = true,

33
features/messages/impl/src/test/kotlin/io/element/android/features/messages/textcomposer/MessageComposerPresenterTest.kt

@ -99,7 +99,7 @@ class MessageComposerPresenterTest { @@ -99,7 +99,7 @@ class MessageComposerPresenterTest {
val initialState = awaitItem()
assertThat(initialState.isFullScreen).isFalse()
assertThat(initialState.richTextEditorState.messageHtml).isEqualTo("")
assertThat(initialState.mode).isEqualTo(MessageComposerMode.Normal(""))
assertThat(initialState.mode).isEqualTo(MessageComposerMode.Normal)
assertThat(initialState.showAttachmentSourcePicker).isFalse()
assertThat(initialState.canShareLocation).isTrue()
assertThat(initialState.attachmentsState).isEqualTo(AttachmentsState.None)
@ -153,7 +153,10 @@ class MessageComposerPresenterTest { @@ -153,7 +153,10 @@ class MessageComposerPresenterTest {
assertThat(state.mode).isEqualTo(mode)
state = awaitItem()
assertThat(state.richTextEditorState.messageHtml).isEqualTo(A_MESSAGE)
backToNormalMode(state, skipCount = 1)
state = backToNormalMode(state, skipCount = 1)
// The message that was being edited is cleared
assertThat(state.richTextEditorState.messageHtml).isEqualTo("")
}
}
@ -174,6 +177,26 @@ class MessageComposerPresenterTest { @@ -174,6 +177,26 @@ class MessageComposerPresenterTest {
}
}
@Test
fun `present - cancel reply`() = runTest {
val presenter = createPresenter(this)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
skipItems(1)
var state = awaitItem()
val mode = aReplyMode()
state.eventSink.invoke(MessageComposerEvents.SetMode(mode))
state = awaitItem()
assertThat(state.mode).isEqualTo(mode)
state.richTextEditorState.setHtml(A_REPLY)
state = backToNormalMode(state)
// The message typed while replying is not cleared
assertThat(state.richTextEditorState.messageHtml).isEqualTo(A_REPLY)
}
}
@Test
fun `present - change mode to quote`() = runTest {
val presenter = createPresenter(this)
@ -683,12 +706,12 @@ class MessageComposerPresenterTest { @@ -683,12 +706,12 @@ class MessageComposerPresenterTest {
}
}
private suspend fun ReceiveTurbine<MessageComposerState>.backToNormalMode(state: MessageComposerState, skipCount: Int = 0) {
private suspend fun ReceiveTurbine<MessageComposerState>.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(

2
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 @@ -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

14
libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt

@ -483,7 +483,7 @@ internal fun TextComposerSimplePreview() = ElementPreview { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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 { @@ -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,
)

2
libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/components/SendButton.kt

@ -93,7 +93,7 @@ internal fun SendButton( @@ -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)

2
libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/MessageComposerMode.kt

@ -24,7 +24,7 @@ import kotlinx.parcelize.Parcelize @@ -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

Loading…
Cancel
Save