Draft : branch reply mode
This commit is contained in:
@@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -170,5 +170,5 @@ interface Timeline : AutoCloseable {
|
||||
progressCallback: ProgressCallback?
|
||||
): Result<MediaUploadHandler>
|
||||
|
||||
suspend fun loadReplyDetails(eventId: EventId): Result<InReplyTo>
|
||||
suspend fun loadReplyDetails(eventId: EventId): InReplyTo
|
||||
}
|
||||
|
||||
@@ -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
|
||||
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)
|
||||
}
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user