Skip to content

Commit 7048da2

Browse files
authored
Fix issue where text is cleared when cancelling a reply (#1617)
1 parent c8dc364 commit 7048da2

File tree

10 files changed

+48
-22
lines changed

10 files changed

+48
-22
lines changed

changelog.d/1617.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix issue where text is cleared when cancelling a reply

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fun aMessagesState() = MessagesState(
5959
composerState = aMessageComposerState().copy(
6060
richTextEditorState = RichTextEditorState("Hello", initialFocus = true),
6161
isFullScreen = false,
62-
mode = MessageComposerMode.Normal("Hello"),
62+
mode = MessageComposerMode.Normal,
6363
),
6464
voiceMessageComposerState = aVoiceMessageComposerState(),
6565
timelineState = aTimelineState().copy(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ import javax.inject.Inject
2929
@SingleIn(RoomScope::class)
3030
@ContributesBinding(RoomScope::class)
3131
class MessageComposerContextImpl @Inject constructor() : MessageComposerContext {
32-
override var composerMode: MessageComposerMode by mutableStateOf(MessageComposerMode.Normal(""))
32+
override var composerMode: MessageComposerMode by mutableStateOf(MessageComposerMode.Normal)
3333
internal set
3434
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ class MessageComposerPresenter @Inject constructor(
155155
when (event) {
156156
MessageComposerEvents.ToggleFullScreenState -> isFullScreen.value = !isFullScreen.value
157157
MessageComposerEvents.CloseSpecialMode -> {
158-
localCoroutineScope.launch {
159-
richTextEditorState.setHtml("")
158+
if (messageComposerContext.composerMode is MessageComposerMode.Edit) {
159+
localCoroutineScope.launch {
160+
richTextEditorState.setHtml("")
161+
}
160162
}
161-
messageComposerContext.composerMode = MessageComposerMode.Normal("")
163+
messageComposerContext.composerMode = MessageComposerMode.Normal
162164
}
163165
is MessageComposerEvents.SendMessage -> appCoroutineScope.sendMessage(
164166
message = event.message,
@@ -253,7 +255,7 @@ class MessageComposerPresenter @Inject constructor(
253255
val capturedMode = messageComposerContext.composerMode
254256
// Reset composer right away
255257
richTextEditorState.setHtml("")
256-
updateComposerMode(MessageComposerMode.Normal(""))
258+
updateComposerMode(MessageComposerMode.Normal)
257259
when (capturedMode) {
258260
is MessageComposerMode.Normal -> room.sendMessage(body = message.markdown, htmlBody = message.html)
259261
is MessageComposerMode.Edit -> {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ open class MessageComposerStateProvider : PreviewParameterProvider<MessageCompos
3030
fun aMessageComposerState(
3131
composerState: RichTextEditorState = RichTextEditorState(""),
3232
isFullScreen: Boolean = false,
33-
mode: MessageComposerMode = MessageComposerMode.Normal(content = ""),
33+
mode: MessageComposerMode = MessageComposerMode.Normal,
3434
showTextFormatting: Boolean = false,
3535
showAttachmentSourcePicker: Boolean = false,
3636
canShareLocation: Boolean = true,

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

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class MessageComposerPresenterTest {
9999
val initialState = awaitItem()
100100
assertThat(initialState.isFullScreen).isFalse()
101101
assertThat(initialState.richTextEditorState.messageHtml).isEqualTo("")
102-
assertThat(initialState.mode).isEqualTo(MessageComposerMode.Normal(""))
102+
assertThat(initialState.mode).isEqualTo(MessageComposerMode.Normal)
103103
assertThat(initialState.showAttachmentSourcePicker).isFalse()
104104
assertThat(initialState.canShareLocation).isTrue()
105105
assertThat(initialState.attachmentsState).isEqualTo(AttachmentsState.None)
@@ -153,7 +153,10 @@ class MessageComposerPresenterTest {
153153
assertThat(state.mode).isEqualTo(mode)
154154
state = awaitItem()
155155
assertThat(state.richTextEditorState.messageHtml).isEqualTo(A_MESSAGE)
156-
backToNormalMode(state, skipCount = 1)
156+
state = backToNormalMode(state, skipCount = 1)
157+
158+
// The message that was being edited is cleared
159+
assertThat(state.richTextEditorState.messageHtml).isEqualTo("")
157160
}
158161
}
159162

@@ -174,6 +177,26 @@ class MessageComposerPresenterTest {
174177
}
175178
}
176179

180+
@Test
181+
fun `present - cancel reply`() = runTest {
182+
val presenter = createPresenter(this)
183+
moleculeFlow(RecompositionMode.Immediate) {
184+
presenter.present()
185+
}.test {
186+
skipItems(1)
187+
var state = awaitItem()
188+
val mode = aReplyMode()
189+
state.eventSink.invoke(MessageComposerEvents.SetMode(mode))
190+
state = awaitItem()
191+
assertThat(state.mode).isEqualTo(mode)
192+
state.richTextEditorState.setHtml(A_REPLY)
193+
state = backToNormalMode(state)
194+
195+
// The message typed while replying is not cleared
196+
assertThat(state.richTextEditorState.messageHtml).isEqualTo(A_REPLY)
197+
}
198+
}
199+
177200
@Test
178201
fun `present - change mode to quote`() = runTest {
179202
val presenter = createPresenter(this)
@@ -683,12 +706,12 @@ class MessageComposerPresenterTest {
683706
}
684707
}
685708

686-
private suspend fun ReceiveTurbine<MessageComposerState>.backToNormalMode(state: MessageComposerState, skipCount: Int = 0) {
709+
private suspend fun ReceiveTurbine<MessageComposerState>.backToNormalMode(state: MessageComposerState, skipCount: Int = 0): MessageComposerState {
687710
state.eventSink.invoke(MessageComposerEvents.CloseSpecialMode)
688711
skipItems(skipCount)
689712
val normalState = awaitItem()
690-
assertThat(normalState.mode).isEqualTo(MessageComposerMode.Normal(""))
691-
assertThat(normalState.richTextEditorState.messageHtml).isEqualTo("")
713+
assertThat(normalState.mode).isEqualTo(MessageComposerMode.Normal)
714+
return normalState
692715
}
693716

694717
private fun createPresenter(

features/messages/test/src/main/kotlin/io/element/android/features/messages/test/MessageComposerContextFake.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ import io.element.android.features.messages.api.MessageComposerContext
2020
import io.element.android.libraries.textcomposer.model.MessageComposerMode
2121

2222
class MessageComposerContextFake(
23-
override var composerMode: MessageComposerMode = MessageComposerMode.Normal(null)
23+
override var composerMode: MessageComposerMode = MessageComposerMode.Normal
2424
) : MessageComposerContext

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
483483
RichTextEditorState("", initialFocus = true),
484484
voiceMessageState = VoiceMessageState.Idle,
485485
onSendMessage = {},
486-
composerMode = MessageComposerMode.Normal(""),
486+
composerMode = MessageComposerMode.Normal,
487487
onResetComposerMode = {},
488488
enableTextFormatting = true,
489489
enableVoiceMessages = true,
@@ -493,7 +493,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
493493
RichTextEditorState("A message", initialFocus = true),
494494
voiceMessageState = VoiceMessageState.Idle,
495495
onSendMessage = {},
496-
composerMode = MessageComposerMode.Normal(""),
496+
composerMode = MessageComposerMode.Normal,
497497
onResetComposerMode = {},
498498
enableTextFormatting = true,
499499
enableVoiceMessages = true,
@@ -506,7 +506,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
506506
),
507507
voiceMessageState = VoiceMessageState.Idle,
508508
onSendMessage = {},
509-
composerMode = MessageComposerMode.Normal(""),
509+
composerMode = MessageComposerMode.Normal,
510510
onResetComposerMode = {},
511511
enableTextFormatting = true,
512512
enableVoiceMessages = true,
@@ -516,7 +516,7 @@ internal fun TextComposerSimplePreview() = ElementPreview {
516516
RichTextEditorState("A message without focus", initialFocus = false),
517517
voiceMessageState = VoiceMessageState.Idle,
518518
onSendMessage = {},
519-
composerMode = MessageComposerMode.Normal(""),
519+
composerMode = MessageComposerMode.Normal,
520520
onResetComposerMode = {},
521521
enableTextFormatting = true,
522522
enableVoiceMessages = true,
@@ -533,7 +533,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
533533
RichTextEditorState("", initialFocus = false),
534534
voiceMessageState = VoiceMessageState.Idle,
535535
showTextFormatting = true,
536-
composerMode = MessageComposerMode.Normal(""),
536+
composerMode = MessageComposerMode.Normal,
537537
enableTextFormatting = true,
538538
enableVoiceMessages = true,
539539
)
@@ -542,7 +542,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
542542
RichTextEditorState("A message", initialFocus = false),
543543
voiceMessageState = VoiceMessageState.Idle,
544544
showTextFormatting = true,
545-
composerMode = MessageComposerMode.Normal(""),
545+
composerMode = MessageComposerMode.Normal,
546546
enableTextFormatting = true,
547547
enableVoiceMessages = true,
548548
)
@@ -551,7 +551,7 @@ internal fun TextComposerFormattingPreview() = ElementPreview {
551551
RichTextEditorState("A message\nWith several lines\nTo preview larger textfields and long lines with overflow", initialFocus = false),
552552
voiceMessageState = VoiceMessageState.Idle,
553553
showTextFormatting = true,
554-
composerMode = MessageComposerMode.Normal(""),
554+
composerMode = MessageComposerMode.Normal,
555555
enableTextFormatting = true,
556556
enableVoiceMessages = true,
557557
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ internal fun SendButton(
9393
@PreviewsDayNight
9494
@Composable
9595
internal fun SendButtonPreview() = ElementPreview {
96-
val normalMode = MessageComposerMode.Normal("")
96+
val normalMode = MessageComposerMode.Normal
9797
val editMode = MessageComposerMode.Edit(null, "", null)
9898
Row {
9999
SendButton(canSendMessage = true, onClick = {}, composerMode = normalMode)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import kotlinx.parcelize.Parcelize
2424

2525
sealed interface MessageComposerMode : Parcelable {
2626
@Parcelize
27-
data class Normal(val content: CharSequence?) : MessageComposerMode
27+
data object Normal: MessageComposerMode
2828

2929
sealed class Special(open val eventId: EventId?, open val defaultContent: String) :
3030
MessageComposerMode

0 commit comments

Comments
 (0)