Media gallery: render Loading state when there is only a loader in the timeline.
This commit is contained in:
parent
ee4595eb54
commit
bb7a90815c
3 changed files with 64 additions and 22 deletions
|
|
@ -25,7 +25,14 @@ data class MediaGalleryState(
|
||||||
data class GroupedMediaItems(
|
data class GroupedMediaItems(
|
||||||
val imageAndVideoItems: ImmutableList<MediaItem>,
|
val imageAndVideoItems: ImmutableList<MediaItem>,
|
||||||
val fileItems: ImmutableList<MediaItem>,
|
val fileItems: ImmutableList<MediaItem>,
|
||||||
)
|
) {
|
||||||
|
fun getItems(mode: MediaGalleryMode): ImmutableList<MediaItem> {
|
||||||
|
return when (mode) {
|
||||||
|
MediaGalleryMode.Images -> imageAndVideoItems
|
||||||
|
MediaGalleryMode.Files -> fileItems
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum class MediaGalleryMode(val stringResource: Int) {
|
enum class MediaGalleryMode(val stringResource: Int) {
|
||||||
Images(R.string.screen_media_browser_list_mode_media),
|
Images(R.string.screen_media_browser_list_mode_media),
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,27 @@ open class MediaGalleryStateProvider : PreviewParameterProvider<MediaGalleryStat
|
||||||
mode = MediaGalleryMode.Files,
|
mode = MediaGalleryMode.Files,
|
||||||
groupedMediaItems = AsyncData.Failure(Exception("Failed to load media")),
|
groupedMediaItems = AsyncData.Failure(Exception("Failed to load media")),
|
||||||
),
|
),
|
||||||
|
// Timeline is loaded but does not have relevant content yet for images and videos
|
||||||
|
aMediaGalleryState(
|
||||||
|
groupedMediaItems = AsyncData.Success(
|
||||||
|
aGroupedMediaItems(
|
||||||
|
imageAndVideoItems = listOf(
|
||||||
|
aMediaItemLoadingIndicator(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
// Timeline is loaded but does not have relevant content yet for files
|
||||||
|
aMediaGalleryState(
|
||||||
|
mode = MediaGalleryMode.Files,
|
||||||
|
groupedMediaItems = AsyncData.Success(
|
||||||
|
aGroupedMediaItems(
|
||||||
|
fileItems = listOf(
|
||||||
|
aMediaItemLoadingIndicator(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -196,30 +196,44 @@ private fun MediaGalleryPage(
|
||||||
state: MediaGalleryState,
|
state: MediaGalleryState,
|
||||||
onItemClick: (MediaItem.Event) -> Unit,
|
onItemClick: (MediaItem.Event) -> Unit,
|
||||||
) {
|
) {
|
||||||
when (val groupedMediaItems = state.groupedMediaItems) {
|
val groupedMediaItems = state.groupedMediaItems
|
||||||
AsyncData.Uninitialized,
|
if (groupedMediaItems.isLoadingItems(mode)) {
|
||||||
is AsyncData.Loading -> {
|
LoadingContent(mode)
|
||||||
LoadingContent(mode)
|
} else {
|
||||||
}
|
when (groupedMediaItems) {
|
||||||
is AsyncData.Success -> {
|
is AsyncData.Success -> {
|
||||||
when (mode) {
|
when (mode) {
|
||||||
MediaGalleryMode.Images -> MediaGalleryImages(
|
MediaGalleryMode.Images -> MediaGalleryImages(
|
||||||
imagesAndVideos = groupedMediaItems.data.imageAndVideoItems,
|
imagesAndVideos = groupedMediaItems.data.imageAndVideoItems,
|
||||||
eventSink = state.eventSink,
|
eventSink = state.eventSink,
|
||||||
onItemClick = onItemClick,
|
onItemClick = onItemClick,
|
||||||
)
|
)
|
||||||
MediaGalleryMode.Files -> MediaGalleryFiles(
|
MediaGalleryMode.Files -> MediaGalleryFiles(
|
||||||
files = groupedMediaItems.data.fileItems,
|
files = groupedMediaItems.data.fileItems,
|
||||||
eventSink = state.eventSink,
|
eventSink = state.eventSink,
|
||||||
onItemClick = onItemClick,
|
onItemClick = onItemClick,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is AsyncData.Failure -> {
|
||||||
|
ErrorContent(
|
||||||
|
error = groupedMediaItems.error,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
else -> Unit
|
||||||
}
|
}
|
||||||
is AsyncData.Failure -> {
|
}
|
||||||
ErrorContent(
|
}
|
||||||
error = groupedMediaItems.error,
|
|
||||||
)
|
/**
|
||||||
}
|
* Return true when the timeline is not loaded or if it contains only a single loading item.
|
||||||
|
*/
|
||||||
|
private fun AsyncData<GroupedMediaItems>.isLoadingItems(mode: MediaGalleryMode): Boolean {
|
||||||
|
return when (this) {
|
||||||
|
AsyncData.Uninitialized,
|
||||||
|
is AsyncData.Loading -> true
|
||||||
|
is AsyncData.Success -> data.getItems(mode).singleOrNull() is MediaItem.LoadingIndicator
|
||||||
|
is AsyncData.Failure -> false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue