diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt index 502ac0ecf1..8096628a88 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt @@ -111,12 +111,14 @@ class MessagesPresenter @Inject constructor( } private suspend fun handleActionRedact(event: TimelineItem.Event) { - room.redactEvent(event.id) + if (event.eventId == null) return + room.redactEvent(event.eventId) } private fun handleActionEdit(targetEvent: TimelineItem.Event, composerState: MessageComposerState) { + if (targetEvent.eventId == null) return val composerMode = MessageComposerMode.Edit( - targetEvent.id, + targetEvent.eventId, (targetEvent.content as? TimelineItemTextBasedContent)?.body.orEmpty() ) composerState.eventSink( @@ -125,7 +127,8 @@ class MessagesPresenter @Inject constructor( } private fun handleActionReply(targetEvent: TimelineItem.Event, composerState: MessageComposerState) { - val composerMode = MessageComposerMode.Reply(targetEvent.safeSenderName, targetEvent.id, "") + if (targetEvent.eventId == null) return + val composerMode = MessageComposerMode.Reply(targetEvent.safeSenderName, targetEvent.eventId, "") composerState.eventSink( MessageComposerEvents.SetMode(composerMode) ) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt index f27ae8eb51..b86e62b9a0 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt @@ -141,12 +141,13 @@ fun TimelineView( private fun TimelineItem.key(): String { return when (this) { - is TimelineItem.Event -> id.value + is TimelineItem.Event -> id is TimelineItem.Virtual -> id } } private fun TimelineItem.contentType(): Int { + // Todo optimize for each subtype return when (this) { is TimelineItem.Event -> 0 is TimelineItem.Virtual -> 1 @@ -415,7 +416,7 @@ private fun createMessageEvent( groupPosition: MessagesItemGroupPosition ): TimelineItem { return TimelineItem.Event( - id = EventId(Math.random().toString()), + id = Math.random().toString(), senderId = "senderId", senderAvatar = AvatarData("sender"), content = content, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt index af201d9a6c..fdd6bc35ab 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/event/TimelineItemEventFactory.kt @@ -22,7 +22,6 @@ import io.element.android.features.messages.timeline.model.TimelineItem import io.element.android.features.messages.timeline.model.TimelineItemReactions import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize -import io.element.android.libraries.matrix.core.EventId import io.element.android.libraries.matrix.room.MatrixRoom import io.element.android.libraries.matrix.timeline.MatrixTimelineItem import kotlinx.collections.immutable.toImmutableList @@ -64,7 +63,8 @@ class TimelineItemEventFactory @Inject constructor( size = AvatarSize.SMALL ) return TimelineItem.Event( - id = EventId(currentTimelineItem.uniqueId), + id = currentTimelineItem.uniqueId, + eventId = currentTimelineItem.eventId, senderId = currentSender, senderDisplayName = senderDisplayName, senderAvatar = senderAvatarData, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt index 4d097ebcbc..26b7caa59c 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/TimelineItem.kt @@ -30,7 +30,8 @@ sealed interface TimelineItem { ) : TimelineItem data class Event( - val id: EventId, + val id: String, + val eventId: EventId? = null, val senderId: String, val senderDisplayName: String?, val senderAvatar: AvatarData, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt index 1924e0830e..c441f08ec8 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/model/event/TimelineItemEventContent.kt @@ -16,9 +16,11 @@ package io.element.android.features.messages.timeline.model.event +import androidx.compose.runtime.Immutable import androidx.compose.ui.tooling.preview.PreviewParameterProvider import org.matrix.rustcomponents.sdk.EncryptedMessage +@Immutable sealed interface TimelineItemEventContent class MessagesTimelineItemContentProvider : PreviewParameterProvider { diff --git a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt index 19a7dfba79..2d31d400a7 100644 --- a/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt +++ b/libraries/matrix/src/main/kotlin/io/element/android/libraries/matrix/timeline/MatrixTimelineItem.kt @@ -16,6 +16,7 @@ package io.element.android.libraries.matrix.timeline +import io.element.android.libraries.matrix.core.EventId import org.matrix.rustcomponents.sdk.EventTimelineItem import org.matrix.rustcomponents.sdk.TimelineItem import org.matrix.rustcomponents.sdk.VirtualTimelineItem @@ -23,6 +24,7 @@ import org.matrix.rustcomponents.sdk.VirtualTimelineItem sealed interface MatrixTimelineItem { data class Event(val event: EventTimelineItem) : MatrixTimelineItem { val uniqueId: String = event.uniqueIdentifier() + val eventId: EventId? = event.eventId()?.let { EventId(it) } } data class Virtual(val virtual: VirtualTimelineItem) : MatrixTimelineItem