Browse Source

Draft : branch reply mode

pull/3099/head
ganfra 3 months ago
parent
commit
6ac7ab84ce
  1. 18
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt
  2. 11
      features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt
  3. 2
      libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt
  4. 30
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt
  5. 4
      libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt

18
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 @@ -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 @@ -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( @@ -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)
)
}
}

11
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 @@ -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( @@ -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
}
}
}
}

2
libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/Timeline.kt

@ -170,5 +170,5 @@ interface Timeline : AutoCloseable { @@ -170,5 +170,5 @@ interface Timeline : AutoCloseable {
progressCallback: ProgressCallback?
): Result<MediaUploadHandler>
suspend fun loadReplyDetails(eventId: EventId): Result<InReplyTo>
suspend fun loadReplyDetails(eventId: EventId): InReplyTo
}

30
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/RustTimeline.kt

@ -582,22 +582,20 @@ class RustTimeline( @@ -582,22 +582,20 @@ class RustTimeline(
}
}
override suspend fun loadReplyDetails(eventId: EventId): Result<InReplyTo> = 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)
}
}
}

4
libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/timeline/FakeTimeline.kt

@ -371,8 +371,8 @@ class FakeTimeline( @@ -371,8 +371,8 @@ class FakeTimeline(
}
}
var loadReplyDetailsLambda: (eventId: EventId) -> Result<InReplyTo> = {
Result.success(InReplyTo.NotLoaded(it))
var loadReplyDetailsLambda: (eventId: EventId) -> InReplyTo = {
InReplyTo.NotLoaded(it)
}
override suspend fun loadReplyDetails(eventId: EventId) = loadReplyDetailsLambda(eventId)

Loading…
Cancel
Save