Improve flows.

This commit is contained in:
Benoit Marty 2022-12-01 11:55:00 +01:00
parent c7d5e1deea
commit e23b25f596
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.TimelineKey
class MessageTimelineItemStateMapper(
class MessageTimelineItemStateFactory(
private val client: MatrixClient,
private val room: MatrixRoom,
private val dispatcher: CoroutineDispatcher,
) {
var highlightedEventId: String? = null
suspend fun map(timelineItems: List<MatrixTimelineItem>): List<MessagesTimelineItemState> =
suspend fun create(
timelineItems: List<MatrixTimelineItem>,
highlightedEventId: String? = null,
): List<MessagesTimelineItemState> =
withContext(dispatcher) {
val messagesTimelineItemState = ArrayList<MessagesTimelineItemState>()
for (index in timelineItems.indices.reversed()) {

View file

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