Pinned events : add debounce on list
This commit is contained in:
parent
a4e0428403
commit
e7228b9460
2 changed files with 8 additions and 3 deletions
|
|
@ -46,7 +46,7 @@ import kotlin.time.Duration.Companion.milliseconds
|
||||||
class PinnedMessagesBannerPresenter @Inject constructor(
|
class PinnedMessagesBannerPresenter @Inject constructor(
|
||||||
private val room: MatrixRoom,
|
private val room: MatrixRoom,
|
||||||
private val itemFactory: PinnedMessagesBannerItemFactory,
|
private val itemFactory: PinnedMessagesBannerItemFactory,
|
||||||
private val timelineController: PinnedEventsTimelineProvider,
|
private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider,
|
||||||
) : Presenter<PinnedMessagesBannerState> {
|
) : Presenter<PinnedMessagesBannerState> {
|
||||||
private val pinnedItems = mutableStateOf<AsyncData<ImmutableList<PinnedMessagesBannerItem>>>(AsyncData.Uninitialized)
|
private val pinnedItems = mutableStateOf<AsyncData<ImmutableList<PinnedMessagesBannerItem>>>(AsyncData.Uninitialized)
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
|
||||||
) {
|
) {
|
||||||
val updatedOnItemsChange by rememberUpdatedState(onItemsChange)
|
val updatedOnItemsChange by rememberUpdatedState(onItemsChange)
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
timelineController.timelineStateFlow
|
pinnedEventsTimelineProvider.timelineStateFlow
|
||||||
.flatMapLatest { asyncTimeline ->
|
.flatMapLatest { asyncTimeline ->
|
||||||
when (asyncTimeline) {
|
when (asyncTimeline) {
|
||||||
AsyncData.Uninitialized -> flowOf(AsyncData.Uninitialized)
|
AsyncData.Uninitialized -> flowOf(AsyncData.Uninitialized)
|
||||||
|
|
|
||||||
|
|
@ -50,13 +50,16 @@ import io.element.android.libraries.matrix.api.room.roomMembers
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.FlowPreview
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
|
import kotlinx.coroutines.flow.debounce
|
||||||
import kotlinx.coroutines.flow.flowOf
|
import kotlinx.coroutines.flow.flowOf
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import kotlin.time.Duration.Companion.milliseconds
|
||||||
|
|
||||||
class PinnedMessagesListPresenter @AssistedInject constructor(
|
class PinnedMessagesListPresenter @AssistedInject constructor(
|
||||||
@Assisted private val navigator: PinnedMessagesListNavigator,
|
@Assisted private val navigator: PinnedMessagesListNavigator,
|
||||||
|
|
@ -171,6 +174,7 @@ class PinnedMessagesListPresenter @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(FlowPreview::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun PinnedMessagesListEffect(onItemsChange: (AsyncData<ImmutableList<TimelineItem>>) -> Unit) {
|
private fun PinnedMessagesListEffect(onItemsChange: (AsyncData<ImmutableList<TimelineItem>>) -> Unit) {
|
||||||
val updatedOnItemsChange by rememberUpdatedState(onItemsChange)
|
val updatedOnItemsChange by rememberUpdatedState(onItemsChange)
|
||||||
|
|
@ -183,7 +187,8 @@ class PinnedMessagesListPresenter @AssistedInject constructor(
|
||||||
is AsyncData.Failure -> flowOf(AsyncData.Failure(asyncTimeline.error))
|
is AsyncData.Failure -> flowOf(AsyncData.Failure(asyncTimeline.error))
|
||||||
is AsyncData.Loading -> flowOf(AsyncData.Loading())
|
is AsyncData.Loading -> flowOf(AsyncData.Loading())
|
||||||
is AsyncData.Success -> {
|
is AsyncData.Success -> {
|
||||||
combine(asyncTimeline.data.timelineItems, room.membersStateFlow) { items, membersState ->
|
val timelineItemsFlow = asyncTimeline.data.timelineItems.debounce(300.milliseconds)
|
||||||
|
combine(timelineItemsFlow, room.membersStateFlow) { items, membersState ->
|
||||||
timelineItemsFactory.replaceWith(
|
timelineItemsFactory.replaceWith(
|
||||||
timelineItems = items,
|
timelineItems = items,
|
||||||
roomMembers = membersState.roomMembers().orEmpty()
|
roomMembers = membersState.roomMembers().orEmpty()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue