Draft : branch reply mode
This commit is contained in:
parent
71667dc235
commit
1b1b556aa4
5 changed files with 31 additions and 32 deletions
|
|
@ -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.TimelineItem
|
||||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent
|
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.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.timeline.model.event.TimelineItemTextBasedContent
|
||||||
import io.element.android.features.messages.impl.typing.TypingNotificationPresenter
|
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.messages.impl.voicemessages.composer.VoiceMessageComposerPresenter
|
||||||
import io.element.android.features.networkmonitor.api.NetworkMonitor
|
import io.element.android.features.networkmonitor.api.NetworkMonitor
|
||||||
import io.element.android.features.networkmonitor.api.NetworkStatus
|
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.MatrixRoomInfo
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
||||||
import io.element.android.libraries.matrix.api.room.MessageEventType
|
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.messages.reply.map
|
||||||
import io.element.android.libraries.matrix.ui.room.canCall
|
import io.element.android.libraries.matrix.ui.room.canCall
|
||||||
import io.element.android.libraries.matrix.ui.room.canRedactOtherAsState
|
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) {
|
private suspend fun handleActionReply(targetEvent: TimelineItem.Event, composerState: MessageComposerState) {
|
||||||
if (targetEvent.eventId == null) return
|
if (targetEvent.eventId == null) return
|
||||||
timelineController.invokeOnCurrentTimeline {
|
timelineController.invokeOnCurrentTimeline {
|
||||||
loadReplyDetails(targetEvent.eventId)
|
val replyToDetails = loadReplyDetails(targetEvent.eventId).map(permalinkParser)
|
||||||
.onSuccess { inReplyTo ->
|
val composerMode = MessageComposerMode.Reply(replyToDetails = replyToDetails)
|
||||||
val composerMode = MessageComposerMode.Reply(
|
composerState.eventSink(
|
||||||
inReplyTo.map(permalinkParser)
|
MessageComposerEvents.SetMode(composerMode)
|
||||||
)
|
)
|
||||||
composerState.eventSink(
|
|
||||||
MessageComposerEvents.SetMode(composerMode)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.onFailure { Timber.e(it) }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.ComposerDraft
|
||||||
import io.element.android.libraries.matrix.api.room.draft.ComposerDraftType
|
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.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.mediapickers.api.PickerProvider
|
||||||
import io.element.android.libraries.mediaupload.api.MediaSender
|
import io.element.android.libraries.mediaupload.api.MediaSender
|
||||||
import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory
|
import io.element.android.libraries.mediaviewer.api.local.LocalMediaFactory
|
||||||
|
|
@ -607,7 +609,14 @@ class MessageComposerPresenter @Inject constructor(
|
||||||
when (val draftType = draft.draftType) {
|
when (val draftType = draft.draftType) {
|
||||||
ComposerDraftType.NewMessage -> messageComposerContext.composerMode = MessageComposerMode.Normal
|
ComposerDraftType.NewMessage -> messageComposerContext.composerMode = MessageComposerMode.Normal
|
||||||
is ComposerDraftType.Edit -> messageComposerContext.composerMode = MessageComposerMode.Edit(draftType.eventId, markdownText, null)
|
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?
|
progressCallback: ProgressCallback?
|
||||||
): Result<MediaUploadHandler>
|
): 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) {
|
override suspend fun loadReplyDetails(eventId: EventId): InReplyTo = withContext(dispatcher) {
|
||||||
runCatching {
|
val timelineItem = _timelineItems.value.firstOrNull { timelineItem ->
|
||||||
val timelineItem = _timelineItems.value.firstOrNull { timelineItem ->
|
timelineItem is MatrixTimelineItem.Event && timelineItem.eventId == eventId
|
||||||
timelineItem is MatrixTimelineItem.Event && timelineItem.eventId == eventId
|
} as? MatrixTimelineItem.Event
|
||||||
} as? MatrixTimelineItem.Event
|
|
||||||
|
|
||||||
if (timelineItem != null) {
|
if (timelineItem != null) {
|
||||||
InReplyTo.Ready(
|
InReplyTo.Ready(
|
||||||
eventId = eventId,
|
eventId = eventId,
|
||||||
content = timelineItem.event.content,
|
content = timelineItem.event.content,
|
||||||
senderId = timelineItem.event.sender,
|
senderId = timelineItem.event.sender,
|
||||||
senderProfile = timelineItem.event.senderProfile,
|
senderProfile = timelineItem.event.senderProfile,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
inner.loadReplyDetails(eventId.value).use(inReplyToMapper::map)
|
inner.loadReplyDetails(eventId.value).use(inReplyToMapper::map)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -371,8 +371,8 @@ class FakeTimeline(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var loadReplyDetailsLambda: (eventId: EventId) -> Result<InReplyTo> = {
|
var loadReplyDetailsLambda: (eventId: EventId) -> InReplyTo = {
|
||||||
Result.success(InReplyTo.NotLoaded(it))
|
InReplyTo.NotLoaded(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun loadReplyDetails(eventId: EventId) = loadReplyDetailsLambda(eventId)
|
override suspend fun loadReplyDetails(eventId: EventId) = loadReplyDetailsLambda(eventId)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue