Gallery: animate items.
This commit is contained in:
parent
ac27d1d474
commit
a9b5c61ebf
1 changed files with 41 additions and 26 deletions
|
|
@ -264,19 +264,26 @@ private fun MediaGalleryFilesList(
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
) {
|
) {
|
||||||
items(files) { item ->
|
items(
|
||||||
|
items = files,
|
||||||
|
key = { it.id() },
|
||||||
|
contentType = { it::class.java },
|
||||||
|
) { item ->
|
||||||
when (item) {
|
when (item) {
|
||||||
is MediaItem.File -> FileItemView(
|
is MediaItem.File -> FileItemView(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
file = item,
|
file = item,
|
||||||
onClick = { onItemClick(item) },
|
onClick = { onItemClick(item) },
|
||||||
)
|
)
|
||||||
is MediaItem.Audio -> AudioItemView(
|
is MediaItem.Audio -> AudioItemView(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
audio = item,
|
audio = item,
|
||||||
onClick = { onItemClick(item) },
|
onClick = { onItemClick(item) },
|
||||||
)
|
)
|
||||||
is MediaItem.Voice -> {
|
is MediaItem.Voice -> {
|
||||||
val presenter: Presenter<VoiceMessageState> = presenterFactories.rememberPresenter(item)
|
val presenter: Presenter<VoiceMessageState> = presenterFactories.rememberPresenter(item)
|
||||||
VoiceItemView(
|
VoiceItemView(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
state = presenter.present(),
|
state = presenter.present(),
|
||||||
voice = item,
|
voice = item,
|
||||||
onShareClick = { eventSink(MediaGalleryEvents.Share(item)) },
|
onShareClick = { eventSink(MediaGalleryEvents.Share(item)) },
|
||||||
|
|
@ -284,13 +291,19 @@ private fun MediaGalleryFilesList(
|
||||||
onInfoClick = { eventSink(MediaGalleryEvents.OpenInfo(item)) },
|
onInfoClick = { eventSink(MediaGalleryEvents.OpenInfo(item)) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is MediaItem.DateSeparator -> DateItemView(item)
|
is MediaItem.DateSeparator -> DateItemView(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
|
item = item
|
||||||
|
)
|
||||||
is MediaItem.Image,
|
is MediaItem.Image,
|
||||||
is MediaItem.Video -> {
|
is MediaItem.Video -> {
|
||||||
// Should not happen
|
// Should not happen
|
||||||
}
|
}
|
||||||
is MediaItem.LoadingIndicator -> {
|
is MediaItem.LoadingIndicator -> {
|
||||||
LoadingMoreIndicator(item.direction)
|
LoadingMoreIndicator(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
|
direction = item.direction,
|
||||||
|
)
|
||||||
val latestEventSink by rememberUpdatedState(eventSink)
|
val latestEventSink by rememberUpdatedState(eventSink)
|
||||||
LaunchedEffect(item.timestamp) {
|
LaunchedEffect(item.timestamp) {
|
||||||
latestEventSink(MediaGalleryEvents.LoadMore(item.direction))
|
latestEventSink(MediaGalleryEvents.LoadMore(item.direction))
|
||||||
|
|
@ -316,7 +329,7 @@ private fun MediaGalleryImageGrid(
|
||||||
verticalArrangement = Arrangement.spacedBy(4.dp),
|
verticalArrangement = Arrangement.spacedBy(4.dp),
|
||||||
) {
|
) {
|
||||||
items(
|
items(
|
||||||
imagesAndVideos,
|
items = imagesAndVideos,
|
||||||
span = { item ->
|
span = { item ->
|
||||||
when (item) {
|
when (item) {
|
||||||
is MediaItem.LoadingIndicator,
|
is MediaItem.LoadingIndicator,
|
||||||
|
|
@ -328,9 +341,10 @@ private fun MediaGalleryImageGrid(
|
||||||
contentType = { it::class.java },
|
contentType = { it::class.java },
|
||||||
) { item ->
|
) { item ->
|
||||||
when (item) {
|
when (item) {
|
||||||
is MediaItem.DateSeparator -> {
|
is MediaItem.DateSeparator -> DateItemView(
|
||||||
DateItemView(item)
|
modifier = Modifier.animateItem(),
|
||||||
}
|
item = item,
|
||||||
|
)
|
||||||
is MediaItem.Audio -> {
|
is MediaItem.Audio -> {
|
||||||
// Should not happen
|
// Should not happen
|
||||||
}
|
}
|
||||||
|
|
@ -340,26 +354,27 @@ private fun MediaGalleryImageGrid(
|
||||||
is MediaItem.File -> {
|
is MediaItem.File -> {
|
||||||
// Should not happen
|
// Should not happen
|
||||||
}
|
}
|
||||||
is MediaItem.Image -> {
|
is MediaItem.Image -> ImageItemView(
|
||||||
ImageItemView(
|
modifier = Modifier.animateItem(),
|
||||||
image = item,
|
image = item,
|
||||||
onClick = { onItemClick(item) },
|
onClick = { onItemClick(item) },
|
||||||
onLongClick = {
|
onLongClick = {
|
||||||
eventSink(MediaGalleryEvents.OpenInfo(item))
|
eventSink(MediaGalleryEvents.OpenInfo(item))
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
is MediaItem.Video -> VideoItemView(
|
||||||
is MediaItem.Video -> {
|
modifier = Modifier.animateItem(),
|
||||||
VideoItemView(
|
video = item,
|
||||||
video = item,
|
onClick = { onItemClick(item) },
|
||||||
onClick = { onItemClick(item) },
|
onLongClick = {
|
||||||
onLongClick = {
|
eventSink(MediaGalleryEvents.OpenInfo(item))
|
||||||
eventSink(MediaGalleryEvents.OpenInfo(item))
|
},
|
||||||
},
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
is MediaItem.LoadingIndicator -> {
|
is MediaItem.LoadingIndicator -> {
|
||||||
LoadingMoreIndicator(item.direction)
|
LoadingMoreIndicator(
|
||||||
|
modifier = Modifier.animateItem(),
|
||||||
|
direction = item.direction,
|
||||||
|
)
|
||||||
val latestEventSink by rememberUpdatedState(eventSink)
|
val latestEventSink by rememberUpdatedState(eventSink)
|
||||||
LaunchedEffect(item.timestamp) {
|
LaunchedEffect(item.timestamp) {
|
||||||
latestEventSink(MediaGalleryEvents.LoadMore(item.direction))
|
latestEventSink(MediaGalleryEvents.LoadMore(item.direction))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue