Improve flows.

This commit is contained in:
Benoit Marty 2022-12-01 11:55:00 +01:00
parent e797e5f154
commit 188937deb6
2 changed files with 19 additions and 20 deletions

View file

@ -20,14 +20,15 @@ import org.matrix.rustcomponents.sdk.MessageFormat
import org.matrix.rustcomponents.sdk.MessageType import org.matrix.rustcomponents.sdk.MessageType
import org.matrix.rustcomponents.sdk.TimelineKey import org.matrix.rustcomponents.sdk.TimelineKey
class MessageTimelineItemStateMapper( class MessageTimelineItemStateFactory(
private val client: MatrixClient, private val client: MatrixClient,
private val room: MatrixRoom, private val room: MatrixRoom,
private val dispatcher: CoroutineDispatcher, private val dispatcher: CoroutineDispatcher,
) { ) {
var highlightedEventId: String? = null suspend fun create(
timelineItems: List<MatrixTimelineItem>,
suspend fun map(timelineItems: List<MatrixTimelineItem>): List<MessagesTimelineItemState> = highlightedEventId: String? = null,
): List<MessagesTimelineItemState> =
withContext(dispatcher) { withContext(dispatcher) {
val messagesTimelineItemState = ArrayList<MessagesTimelineItemState>() val messagesTimelineItemState = ArrayList<MessagesTimelineItemState>()
for (index in timelineItems.indices.reversed()) { for (index in timelineItems.indices.reversed()) {

View file

@ -28,7 +28,7 @@ class MessagesViewModel(
private val client: MatrixClient, private val client: MatrixClient,
private val room: MatrixRoom, private val room: MatrixRoom,
private val timeline: MatrixTimeline, private val timeline: MatrixTimeline,
private val messageTimelineItemStateMapper: MessageTimelineItemStateMapper, private val messageTimelineItemStateFactory: MessageTimelineItemStateFactory,
private val initialState: MessagesViewState private val initialState: MessagesViewState
) : ) :
MavericksViewModel<MessagesViewState>(initialState) { MavericksViewModel<MessagesViewState>(initialState) {
@ -42,13 +42,13 @@ class MessagesViewModel(
val matrix = MatrixInstance.getInstance() val matrix = MatrixInstance.getInstance()
val client = matrix.activeClient() val client = matrix.activeClient()
val room = client.getRoom(state.roomId) ?: return null val room = client.getRoom(state.roomId) ?: return null
val messageTimelineItemStateMapper = val messageTimelineItemStateFactory =
MessageTimelineItemStateMapper(client, room, Dispatchers.Default) MessageTimelineItemStateFactory(client, room, Dispatchers.Default)
return MessagesViewModel( return MessagesViewModel(
client, client,
room, room,
room.timeline(), room.timeline(),
messageTimelineItemStateMapper, messageTimelineItemStateFactory,
state state
) )
} }
@ -191,20 +191,18 @@ class MessagesViewModel(
combine( combine(
timeline.timelineItems(), timeline.timelineItems(),
stateFlow stateFlow.map {
.map { it.composerMode } when (it.composerMode) {
.distinctUntilChanged() is MessageComposerMode.Normal -> null
) { timelineItems, messageComposerMode -> is MessageComposerMode.Edit -> it.composerMode.eventId
// Set the highlightedEventId to messageTimelineItemStateMapper, before the mapping occurs is MessageComposerMode.Quote -> null
messageTimelineItemStateMapper.highlightedEventId = when (messageComposerMode) { is MessageComposerMode.Reply -> it.composerMode.eventId
is MessageComposerMode.Normal -> null }
is MessageComposerMode.Edit -> messageComposerMode.eventId
is MessageComposerMode.Quote -> null
is MessageComposerMode.Reply -> messageComposerMode.eventId
} }
timelineItems .distinctUntilChanged()
) { timelineItems, highlightedEventId ->
messageTimelineItemStateFactory.create(timelineItems, highlightedEventId)
} }
.map(messageTimelineItemStateMapper::map)
.execute { .execute {
copy(timelineItems = it) copy(timelineItems = it)
} }