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. 11
      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
interface ComposerDraftService { interface ComposerDraftService {
suspend fun loadDraft(roomId: RoomId): ComposerDraft? suspend fun loadDraft(roomId: RoomId): ComposerDraft?
suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft) suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?)
} }

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

@ -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 -> client.getRoom(roomId)?.use { room ->
val updateDraftResult = if (draft == null) {
room.clearComposerDraft()
} else {
room.saveComposerDraft(draft) room.saveComposerDraft(draft)
}
updateDraftResult
.onFailure { .onFailure {
Timber.e(it, "Failed to save composer draft for room $roomId") Timber.e(it, "Failed to update composer draft for room $roomId")
} }
.onSuccess { .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(
} }
is MessageComposerMode.Reply -> ComposerDraftType.Reply(mode.eventId) is MessageComposerMode.Reply -> ComposerDraftType.Reply(mode.eventId)
} }
if (draftType == null || markdown.isBlank()) { val composerDraft = if (draftType == null || markdown.isBlank()) {
return@launch null
} else { } else {
val composerDraft = ComposerDraft( ComposerDraft(
draftType = draftType, draftType = draftType,
htmlText = html, htmlText = html,
plainText = markdown, plainText = markdown,
) )
draftService.saveDraft(room.roomId, composerDraft)
} }
draftService.updateDraft(room.roomId, composerDraft)
} }
private fun CoroutineScope.toggleTextFormatting( 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 {
var loadDraftLambda: (RoomId) -> ComposerDraft? = { null } var loadDraftLambda: (RoomId) -> ComposerDraft? = { null }
override suspend fun loadDraft(roomId: RoomId) = loadDraftLambda(roomId) override suspend fun loadDraft(roomId: RoomId) = loadDraftLambda(roomId)
var saveDraftLambda: (RoomId, ComposerDraft) -> Unit = { _, _ -> } var saveDraftLambda: (RoomId, ComposerDraft?) -> Unit = { _, _ -> }
override suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft) = saveDraftLambda(roomId, draft) 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 {
} }
@Test @Test
fun `present - when save draft event is invoked and composer is empty then nothing happens`() = runTest { 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 saveDraftLambda = lambdaRecorder<RoomId, ComposerDraft?, Unit> { _, _ -> }
val composerDraftService = FakeComposerDraftService().apply { val composerDraftService = FakeComposerDraftService().apply {
this.saveDraftLambda = saveDraftLambda this.saveDraftLambda = saveDraftLambda
} }
@ -1189,13 +1189,14 @@ class MessageComposerPresenterTest {
initialState.eventSink.invoke(MessageComposerEvents.SaveDraft) initialState.eventSink.invoke(MessageComposerEvents.SaveDraft)
advanceUntilIdle() advanceUntilIdle()
assert(saveDraftLambda) assert(saveDraftLambda)
.isNeverCalled() .isCalledOnce()
.with(value(A_ROOM_ID), value(null))
} }
} }
@Test @Test
fun `present - when save draft event is invoked and composer is not empty then service is called`() = runTest { 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 { val composerDraftService = FakeComposerDraftService().apply {
this.saveDraftLambda = saveDraftLambda this.saveDraftLambda = saveDraftLambda
} }

Loading…
Cancel
Save