Browse Source

Merge pull request #3115 from element-hq/feature/fga/fix_draft_not_cleared

Draft : also clear draft when composer is blank
pull/3119/head
ganfra 3 months ago committed by GitHub
parent
commit
32b1b6e3f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftService.kt
  2. 13
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt
  3. 8
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
  4. 4
      features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt
  5. 9
      features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt

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

@ -21,5 +21,5 @@ import io.element.android.libraries.matrix.api.room.draft.ComposerDraft @@ -21,5 +21,5 @@ import io.element.android.libraries.matrix.api.room.draft.ComposerDraft
interface ComposerDraftService {
suspend fun loadDraft(roomId: RoomId): ComposerDraft?
suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft)
suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?)
}

13
features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt

@ -42,14 +42,19 @@ class DefaultComposerDraftService @Inject constructor( @@ -42,14 +42,19 @@ class DefaultComposerDraftService @Inject constructor(
}
}
override suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft) {
override suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?) {
client.getRoom(roomId)?.use { room ->
room.saveComposerDraft(draft)
val updateDraftResult = if (draft == null) {
room.clearComposerDraft()
} else {
room.saveComposerDraft(draft)
}
updateDraftResult
.onFailure {
Timber.e(it, "Failed to save composer draft for room $roomId")
Timber.e(it, "Failed to update composer draft for room $roomId")
}
.onSuccess {
Timber.d("Saved composer draft for room $roomId")
Timber.d("Updated composer draft for room $roomId")
}
}
}

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

@ -582,16 +582,16 @@ class MessageComposerPresenter @Inject constructor( @@ -582,16 +582,16 @@ class MessageComposerPresenter @Inject constructor(
}
is MessageComposerMode.Reply -> ComposerDraftType.Reply(mode.eventId)
}
if (draftType == null || markdown.isBlank()) {
return@launch
val composerDraft = if (draftType == null || markdown.isBlank()) {
null
} else {
val composerDraft = ComposerDraft(
ComposerDraft(
draftType = draftType,
htmlText = html,
plainText = markdown,
)
draftService.saveDraft(room.roomId, composerDraft)
}
draftService.updateDraft(room.roomId, composerDraft)
}
private fun CoroutineScope.toggleTextFormatting(

4
features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt

@ -23,6 +23,6 @@ class FakeComposerDraftService : ComposerDraftService { @@ -23,6 +23,6 @@ class FakeComposerDraftService : ComposerDraftService {
var loadDraftLambda: (RoomId) -> ComposerDraft? = { null }
override suspend fun loadDraft(roomId: RoomId) = loadDraftLambda(roomId)
var saveDraftLambda: (RoomId, ComposerDraft) -> Unit = { _, _ -> }
override suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft) = saveDraftLambda(roomId, draft)
var saveDraftLambda: (RoomId, ComposerDraft?) -> Unit = { _, _ -> }
override suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?) = saveDraftLambda(roomId, draft)
}

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

@ -1176,8 +1176,8 @@ class MessageComposerPresenterTest { @@ -1176,8 +1176,8 @@ class MessageComposerPresenterTest {
}
@Test
fun `present - when save draft event is invoked and composer is empty then nothing happens`() = runTest {
val saveDraftLambda = lambdaRecorder<RoomId, ComposerDraft, Unit> { _, _ -> }
fun `present - when save draft event is invoked and composer is empty then service is called with null draft`() = runTest {
val saveDraftLambda = lambdaRecorder<RoomId, ComposerDraft?, Unit> { _, _ -> }
val composerDraftService = FakeComposerDraftService().apply {
this.saveDraftLambda = saveDraftLambda
}
@ -1189,13 +1189,14 @@ class MessageComposerPresenterTest { @@ -1189,13 +1189,14 @@ class MessageComposerPresenterTest {
initialState.eventSink.invoke(MessageComposerEvents.SaveDraft)
advanceUntilIdle()
assert(saveDraftLambda)
.isNeverCalled()
.isCalledOnce()
.with(value(A_ROOM_ID), value(null))
}
}
@Test
fun `present - when save draft event is invoked and composer is not empty then service is called`() = runTest {
val saveDraftLambda = lambdaRecorder<RoomId, ComposerDraft, Unit> { _, _ -> }
val saveDraftLambda = lambdaRecorder<RoomId, ComposerDraft?, Unit> { _, _ -> }
val composerDraftService = FakeComposerDraftService().apply {
this.saveDraftLambda = saveDraftLambda
}

Loading…
Cancel
Save