Browse Source

Improve flows.

feature/bma/flipper
Benoit Marty 2 years ago
parent
commit
e23b25f596
  1. 9
      features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateFactory.kt
  2. 26
      features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt

9
features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateMapper.kt → features/messages/src/main/java/io/element/android/x/features/messages/MessageTimelineItemStateFactory.kt

@ -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()) {

26
features/messages/src/main/java/io/element/android/x/features/messages/MessagesViewModel.kt

@ -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()
) { timelineItems, messageComposerMode ->
// Set the highlightedEventId to messageTimelineItemStateMapper, before the mapping occurs
messageTimelineItemStateMapper.highlightedEventId = when (messageComposerMode) {
is MessageComposerMode.Normal -> null is MessageComposerMode.Normal -> null
is MessageComposerMode.Edit -> messageComposerMode.eventId is MessageComposerMode.Edit -> it.composerMode.eventId
is MessageComposerMode.Quote -> null is MessageComposerMode.Quote -> null
is MessageComposerMode.Reply -> messageComposerMode.eventId is MessageComposerMode.Reply -> it.composerMode.eventId
}
} }
timelineItems .distinctUntilChanged()
) { timelineItems, highlightedEventId ->
messageTimelineItemStateFactory.create(timelineItems, highlightedEventId)
} }
.map(messageTimelineItemStateMapper::map)
.execute { .execute {
copy(timelineItems = it) copy(timelineItems = it)
} }

Loading…
Cancel
Save