|
|
@ -59,16 +59,16 @@ class TimelinePresenter @Inject constructor( |
|
|
|
var lastReadMarkerIndex by rememberSaveable { mutableStateOf(Int.MAX_VALUE) } |
|
|
|
var lastReadMarkerIndex by rememberSaveable { mutableStateOf(Int.MAX_VALUE) } |
|
|
|
var lastReadMarkerId by rememberSaveable { mutableStateOf<EventId?>(null) } |
|
|
|
var lastReadMarkerId by rememberSaveable { mutableStateOf<EventId?>(null) } |
|
|
|
|
|
|
|
|
|
|
|
val timelineItems = timelineItemsFactory.collectItemsAsState() |
|
|
|
val timelineItems by timelineItemsFactory.collectItemsAsState() |
|
|
|
val paginationState = timeline.paginationState.collectAsState() |
|
|
|
val paginationState by timeline.paginationState.collectAsState() |
|
|
|
|
|
|
|
|
|
|
|
fun handleEvents(event: TimelineEvents) { |
|
|
|
fun handleEvents(event: TimelineEvents) { |
|
|
|
when (event) { |
|
|
|
when (event) { |
|
|
|
TimelineEvents.LoadMore -> localCoroutineScope.loadMore(paginationState.value) |
|
|
|
TimelineEvents.LoadMore -> localCoroutineScope.loadMore(paginationState) |
|
|
|
is TimelineEvents.SetHighlightedEvent -> highlightedEventId.value = event.eventId |
|
|
|
is TimelineEvents.SetHighlightedEvent -> highlightedEventId.value = event.eventId |
|
|
|
is TimelineEvents.OnScrollFinished -> { |
|
|
|
is TimelineEvents.OnScrollFinished -> { |
|
|
|
// Get last valid EventId seen by the user, as the first index might refer to a Virtual item |
|
|
|
// Get last valid EventId seen by the user, as the first index might refer to a Virtual item |
|
|
|
val eventId = getLastEventIdBeforeOrAt(event.firstIndex, timelineItems.value) ?: return |
|
|
|
val eventId = getLastEventIdBeforeOrAt(event.firstIndex, timelineItems) ?: return |
|
|
|
if (event.firstIndex <= lastReadMarkerIndex && eventId != lastReadMarkerId) { |
|
|
|
if (event.firstIndex <= lastReadMarkerIndex && eventId != lastReadMarkerId) { |
|
|
|
lastReadMarkerIndex = event.firstIndex |
|
|
|
lastReadMarkerIndex = event.firstIndex |
|
|
|
lastReadMarkerId = eventId |
|
|
|
lastReadMarkerId = eventId |
|
|
@ -82,13 +82,18 @@ class TimelinePresenter @Inject constructor( |
|
|
|
timeline |
|
|
|
timeline |
|
|
|
.timelineItems |
|
|
|
.timelineItems |
|
|
|
.onEach(timelineItemsFactory::replaceWith) |
|
|
|
.onEach(timelineItemsFactory::replaceWith) |
|
|
|
|
|
|
|
.onEach { timelineItems -> |
|
|
|
|
|
|
|
if (timelineItems.isEmpty()) { |
|
|
|
|
|
|
|
loadMore(paginationState) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
.launchIn(this) |
|
|
|
.launchIn(this) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return TimelineState( |
|
|
|
return TimelineState( |
|
|
|
highlightedEventId = highlightedEventId.value, |
|
|
|
highlightedEventId = highlightedEventId.value, |
|
|
|
paginationState = paginationState.value, |
|
|
|
paginationState = paginationState, |
|
|
|
timelineItems = timelineItems.value, |
|
|
|
timelineItems = timelineItems, |
|
|
|
eventSink = ::handleEvents |
|
|
|
eventSink = ::handleEvents |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|