Ensure gallery is paginating to get new items.
This commit is contained in:
@@ -198,6 +198,13 @@ private fun MediaGalleryPage(
|
||||
) {
|
||||
val groupedMediaItems = state.groupedMediaItems
|
||||
if (groupedMediaItems.isLoadingItems(mode)) {
|
||||
// Need to trigger a pagination now if there is only one LoadingIndicator.
|
||||
(groupedMediaItems.dataOrNull()
|
||||
?.getItems(mode)?.singleOrNull() as? MediaItem.LoadingIndicator)?.let { item ->
|
||||
LaunchedEffect(item.timestamp) {
|
||||
state.eventSink(MediaGalleryEvents.LoadMore(item.direction))
|
||||
}
|
||||
}
|
||||
LoadingContent(mode)
|
||||
} else {
|
||||
when (groupedMediaItems) {
|
||||
|
||||
@@ -71,14 +71,26 @@ class MediaViewerDataSource(
|
||||
fun dataFlow(): Flow<PersistentList<MediaViewerPageData>> {
|
||||
return galleryDataSource.groupedMediaItemsFlow()
|
||||
.map { groupedItems ->
|
||||
if (groupedItems is AsyncData.Failure) {
|
||||
persistentListOf(
|
||||
MediaViewerPageData.Failure(groupedItems.error),
|
||||
)
|
||||
} else {
|
||||
val mediaItems = groupedItems.dataOrNull()?.getItems(galleryMode).orEmpty()
|
||||
withContext(dispatcher) {
|
||||
buildMediaViewerPageList(mediaItems)
|
||||
when (groupedItems) {
|
||||
AsyncData.Uninitialized,
|
||||
is AsyncData.Loading -> {
|
||||
persistentListOf(
|
||||
MediaViewerPageData.Loading(
|
||||
direction = Timeline.PaginationDirection.BACKWARDS,
|
||||
timestamp = systemClock.epochMillis(),
|
||||
)
|
||||
)
|
||||
}
|
||||
is AsyncData.Failure -> {
|
||||
persistentListOf(
|
||||
MediaViewerPageData.Failure(groupedItems.error),
|
||||
)
|
||||
}
|
||||
is AsyncData.Success -> {
|
||||
withContext(dispatcher) {
|
||||
val mediaItems = groupedItems.data.getItems(galleryMode)
|
||||
buildMediaViewerPageList(mediaItems)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -117,14 +129,6 @@ class MediaViewerDataSource(
|
||||
)
|
||||
}
|
||||
}
|
||||
if (isEmpty()) {
|
||||
add(
|
||||
MediaViewerPageData.Loading(
|
||||
direction = Timeline.PaginationDirection.BACKWARDS,
|
||||
timestamp = systemClock.epochMillis(),
|
||||
)
|
||||
)
|
||||
}
|
||||
}.toPersistentList()
|
||||
|
||||
fun clearLoadingError(data: MediaViewerPageData.MediaViewerData) {
|
||||
|
||||
@@ -91,13 +91,7 @@ class MediaViewerDataSourceTest {
|
||||
)
|
||||
)
|
||||
val result = awaitItem()
|
||||
assertThat(result).hasSize(1)
|
||||
assertThat(result.first()).isEqualTo(
|
||||
MediaViewerPageData.Loading(
|
||||
direction = Timeline.PaginationDirection.BACKWARDS,
|
||||
timestamp = A_FAKE_TIMESTAMP,
|
||||
)
|
||||
)
|
||||
assertThat(result).isEmpty()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ class MediaViewerPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java)
|
||||
assertThat(initialState.listData).isEmpty()
|
||||
assertThat(initialState.currentIndex).isEqualTo(0)
|
||||
assertThat(initialState.snackbarMessage).isNull()
|
||||
assertThat(initialState.canShowInfo).isTrue()
|
||||
@@ -90,7 +90,7 @@ class MediaViewerPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java)
|
||||
assertThat(initialState.listData).isEmpty()
|
||||
assertThat(initialState.currentIndex).isEqualTo(0)
|
||||
assertThat(initialState.snackbarMessage).isNull()
|
||||
assertThat(initialState.canShowInfo).isFalse()
|
||||
@@ -108,7 +108,7 @@ class MediaViewerPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java)
|
||||
assertThat(initialState.listData).isEmpty()
|
||||
assertThat(initialState.currentIndex).isEqualTo(0)
|
||||
assertThat(initialState.snackbarMessage).isNull()
|
||||
assertThat(initialState.canShowInfo).isTrue()
|
||||
@@ -127,7 +127,7 @@ class MediaViewerPresenterTest {
|
||||
)
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java)
|
||||
assertThat(initialState.listData).isEmpty()
|
||||
assertThat(initialState.currentIndex).isEqualTo(0)
|
||||
assertThat(initialState.snackbarMessage).isNull()
|
||||
assertThat(initialState.canShowInfo).isTrue()
|
||||
@@ -146,7 +146,7 @@ class MediaViewerPresenterTest {
|
||||
val anImage = aMediaItemImage()
|
||||
presenter.test {
|
||||
val initialState = awaitFirstItem()
|
||||
assertThat(initialState.listData.singleOrNull()).isInstanceOf(MediaViewerPageData.Loading::class.java)
|
||||
assertThat(initialState.listData).isEmpty()
|
||||
mediaGalleryDataSource.emitGroupedMediaItems(
|
||||
AsyncData.Success(
|
||||
GroupedMediaItems(
|
||||
|
||||
Reference in New Issue
Block a user