diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftService.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftService.kt index 1c14b835f8..841593a02f 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/ComposerDraftService.kt +++ b/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 { suspend fun loadDraft(roomId: RoomId): ComposerDraft? - suspend fun saveDraft(roomId: RoomId, draft: ComposerDraft) + suspend fun updateDraft(roomId: RoomId, draft: ComposerDraft?) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt index dcf2abddb8..ac39dda02c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/draft/DefaultComposerDraftService.kt +++ b/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 -> - 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") } } } 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 882deef6dd..65af3b0e7f 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 @@ -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( diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt index 25e0715c74..392a3a0e03 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/draft/FakeComposerDraftService.kt +++ b/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 } 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) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt index b2683dc895..d4a12d5c6c 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt @@ -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 { _, _ -> } + fun `present - when save draft event is invoked and composer is empty then service is called with null draft`() = runTest { + val saveDraftLambda = lambdaRecorder { _, _ -> } val composerDraftService = FakeComposerDraftService().apply { this.saveDraftLambda = saveDraftLambda } @@ -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 { _, _ -> } + val saveDraftLambda = lambdaRecorder { _, _ -> } val composerDraftService = FakeComposerDraftService().apply { this.saveDraftLambda = saveDraftLambda }