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 30747786b8..f94b7a9431 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 @@ -167,9 +167,14 @@ class MessageComposerPresenter @Inject constructor( ) is MessageComposerEvents.SetMode -> { messageComposerContext.composerMode = event.composerMode - if (event.composerMode is MessageComposerMode.Reply) { + when (event.composerMode) { + is MessageComposerMode.Reply -> event.composerMode.eventId + is MessageComposerMode.Edit -> event.composerMode.eventId + is MessageComposerMode.Normal -> null + is MessageComposerMode.Quote -> null + }.let { relatedEventId -> appCoroutineScope.launch { - room.enterReplyMode(event.composerMode.eventId) + room.enterSpecialMode(relatedEventId) } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt index 8f00dfb0dd..bd3090e390 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/TimelineItem.kt @@ -54,6 +54,7 @@ sealed interface TimelineItem { @Immutable data class Event( val id: String, + // Note: eventId can be null when the event is a local echo val eventId: EventId? = null, val transactionId: TransactionId? = null, val senderId: UserId, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41622861a0..19358ca32a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -150,7 +150,7 @@ jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = { module = "app.cash.molecule:molecule-runtime", version.ref = "molecule" } timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.58" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.1.59" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 75b4a3fce0..e14138f837 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -89,7 +89,7 @@ interface MatrixRoom : Closeable { suspend fun editMessage(originalEventId: EventId?, transactionId: TransactionId?, body: String, htmlBody: String?): Result - suspend fun enterReplyMode(eventId: EventId): Result + suspend fun enterSpecialMode(eventId: EventId?): Result suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index ec4b989b9c..2fd9760b21 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -124,7 +124,7 @@ class RustMatrixRoom( roomCoroutineScope.cancel() innerRoom.destroy() roomListItem.destroy() - inReplyToEventTimelineItem?.destroy() + specialModeEventTimelineItem?.destroy() } override val name: String? @@ -238,7 +238,14 @@ class RustMatrixRoom( withContext(roomDispatcher) { if (originalEventId != null) { runCatching { - innerRoom.edit(messageEventContentFromParts(body, htmlBody), originalEventId.value) + val editedEvent = specialModeEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(originalEventId.value) + editedEvent.use { + innerRoom.edit( + newContent = messageEventContentFromParts(body, htmlBody), + editItem = it, + ) + } + specialModeEventTimelineItem = null } } else { runCatching { @@ -248,23 +255,23 @@ class RustMatrixRoom( } } - private var inReplyToEventTimelineItem: EventTimelineItem? = null + private var specialModeEventTimelineItem: EventTimelineItem? = null - override suspend fun enterReplyMode(eventId: EventId): Result = withContext(roomDispatcher) { + override suspend fun enterSpecialMode(eventId: EventId?): Result = withContext(roomDispatcher) { runCatching { - inReplyToEventTimelineItem?.destroy() - inReplyToEventTimelineItem = null - inReplyToEventTimelineItem = innerRoom.getEventTimelineItemByEventId(eventId.value) + specialModeEventTimelineItem?.destroy() + specialModeEventTimelineItem = null + specialModeEventTimelineItem = eventId?.let { innerRoom.getEventTimelineItemByEventId(it.value) } } } override suspend fun replyMessage(eventId: EventId, body: String, htmlBody: String?): Result = withContext(roomDispatcher) { runCatching { - val inReplyTo = inReplyToEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(eventId.value) + val inReplyTo = specialModeEventTimelineItem ?: innerRoom.getEventTimelineItemByEventId(eventId.value) inReplyTo.use { eventTimelineItem -> innerRoom.sendReply(messageEventContentFromParts(body, htmlBody), eventTimelineItem) } - inReplyToEventTimelineItem = null + specialModeEventTimelineItem = null } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index bfbdb4206c..4934867b55 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -208,7 +208,7 @@ class FakeMatrixRoom( var replyMessageParameter: Pair? = null private set - override suspend fun enterReplyMode(eventId: EventId): Result { + override suspend fun enterSpecialMode(eventId: EventId?): Result { return Result.success(Unit) }