From 6ac7ab84ce62ebbc81c1a6705f1ec53f9c3bc6f4 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 21 Jun 2024 12:40:16 +0200 Subject: [PATCH] Draft : branch reply mode --- .../messages/impl/MessagesPresenter.kt | 18 ++++------- .../MessageComposerPresenter.kt | 11 ++++++- .../libraries/matrix/api/timeline/Timeline.kt | 2 +- .../matrix/impl/timeline/RustTimeline.kt | 30 +++++++++---------- .../matrix/test/timeline/FakeTimeline.kt | 4 +-- 5 files changed, 32 insertions(+), 33 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 8202360bbf..4d7adaeba9 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -49,10 +49,8 @@ import io.element.android.features.messages.impl.timeline.components.receipt.bot import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStateContent -import io.element.android.features.messages.impl.timeline.model.event.TimelineItemStickerContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent import io.element.android.features.messages.impl.typing.TypingNotificationPresenter -import io.element.android.features.messages.impl.utils.messagesummary.MessageSummaryFormatter import io.element.android.features.messages.impl.voicemessages.composer.VoiceMessageComposerPresenter import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.api.NetworkStatus @@ -74,7 +72,6 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState import io.element.android.libraries.matrix.api.room.MessageEventType -import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.matrix.ui.room.canCall import io.element.android.libraries.matrix.ui.room.canRedactOtherAsState @@ -334,16 +331,11 @@ class MessagesPresenter @AssistedInject constructor( private suspend fun handleActionReply(targetEvent: TimelineItem.Event, composerState: MessageComposerState) { if (targetEvent.eventId == null) return timelineController.invokeOnCurrentTimeline { - loadReplyDetails(targetEvent.eventId) - .onSuccess { inReplyTo -> - val composerMode = MessageComposerMode.Reply( - inReplyTo.map(permalinkParser) - ) - composerState.eventSink( - MessageComposerEvents.SetMode(composerMode) - ) - } - .onFailure { Timber.e(it) } + val replyToDetails = loadReplyDetails(targetEvent.eventId).map(permalinkParser) + val composerMode = MessageComposerMode.Reply(replyToDetails = replyToDetails) + composerState.eventSink( + MessageComposerEvents.SetMode(composerMode) + ) } } 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 87bc02911d..8e469e756f 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 @@ -58,6 +58,8 @@ import io.element.android.libraries.matrix.api.room.Mention import io.element.android.libraries.matrix.api.room.draft.ComposerDraft import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType import io.element.android.libraries.matrix.api.user.CurrentSessionIdHolder +import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails +import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.mediapickers.api.PickerProvider import io.element.android.libraries.mediaupload.api.MediaSender import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory @@ -607,7 +609,14 @@ class MessageComposerPresenter @Inject constructor( when (val draftType = draft.draftType) { ComposerDraftType.NewMessage -> messageComposerContext.composerMode = MessageComposerMode.Normal is ComposerDraftType.Edit -> messageComposerContext.composerMode = MessageComposerMode.Edit(draftType.eventId, markdownText, null) - is ComposerDraftType.Reply -> messageComposerContext.composerMode = MessageComposerMode.Normal + is ComposerDraftType.Reply -> { + messageComposerContext.composerMode = MessageComposerMode.Reply(InReplyToDetails.Loading(draftType.eventId)) + timelineController.invokeOnCurrentTimeline { + val replyToDetails = loadReplyDetails(draftType.eventId).map(permalinkParser) + messageComposerContext.composerMode = MessageComposerMode.Reply(replyToDetails) + Unit + } + } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt index 8e022828d2..1c750ec97d 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt @@ -170,5 +170,5 @@ interface Timeline : AutoCloseable { progressCallback: ProgressCallback? ): Result - suspend fun loadReplyDetails(eventId: EventId): Result + suspend fun loadReplyDetails(eventId: EventId): InReplyTo } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt index b9c786210c..37edf5548f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt @@ -582,22 +582,20 @@ class RustTimeline( } } - override suspend fun loadReplyDetails(eventId: EventId): Result = withContext(dispatcher) { - runCatching { - val timelineItem = _timelineItems.value.firstOrNull { timelineItem -> - timelineItem is MatrixTimelineItem.Event && timelineItem.eventId == eventId - } as? MatrixTimelineItem.Event - - if (timelineItem != null) { - InReplyTo.Ready( - eventId = eventId, - content = timelineItem.event.content, - senderId = timelineItem.event.sender, - senderProfile = timelineItem.event.senderProfile, - ) - } else { - inner.loadReplyDetails(eventId.value).use(inReplyToMapper::map) - } + override suspend fun loadReplyDetails(eventId: EventId): InReplyTo = withContext(dispatcher) { + val timelineItem = _timelineItems.value.firstOrNull { timelineItem -> + timelineItem is MatrixTimelineItem.Event && timelineItem.eventId == eventId + } as? MatrixTimelineItem.Event + + if (timelineItem != null) { + InReplyTo.Ready( + eventId = eventId, + content = timelineItem.event.content, + senderId = timelineItem.event.sender, + senderProfile = timelineItem.event.senderProfile, + ) + } else { + inner.loadReplyDetails(eventId.value).use(inReplyToMapper::map) } } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt index d1da0581da..6944d4f95c 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt @@ -371,8 +371,8 @@ class FakeTimeline( } } - var loadReplyDetailsLambda: (eventId: EventId) -> Result = { - Result.success(InReplyTo.NotLoaded(it)) + var loadReplyDetailsLambda: (eventId: EventId) -> InReplyTo = { + InReplyTo.NotLoaded(it) } override suspend fun loadReplyDetails(eventId: EventId) = loadReplyDetailsLambda(eventId)