Add animateItemPlacement to LazyColumn items

This commit is contained in:
Mohamed
2024-05-29 16:55:49 +03:00
parent b20f1ba522
commit fcf7f40af3
2 changed files with 16 additions and 14 deletions

View File

@ -1,12 +1,11 @@
package app.omnivore.omnivore.feature.library package app.omnivore.omnivore.feature.library
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.FloatTweenSpec import androidx.compose.animation.core.FloatTweenSpec
import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -58,8 +57,6 @@ import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
@ -80,7 +77,6 @@ import app.omnivore.omnivore.navigation.TopLevelDestination
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.jar.Manifest
@Composable @Composable
internal fun LibraryView( internal fun LibraryView(
@ -91,12 +87,11 @@ internal fun LibraryView(
viewModel: LibraryViewModel = hiltViewModel() viewModel: LibraryViewModel = hiltViewModel()
) { ) {
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
val coroutineScope = rememberCoroutineScope()
val uiState by viewModel.uiState.collectAsStateWithLifecycle() val uiState by viewModel.uiState.collectAsStateWithLifecycle()
viewModel.snackbarMessage?.let { LaunchedEffect(viewModel.snackbarMessage) {
coroutineScope.launch { viewModel.snackbarMessage?.let {
snackbarHostState.showSnackbar(it) snackbarHostState.showSnackbar(it)
viewModel.clearSnackbarMessage() viewModel.clearSnackbarMessage()
} }
@ -135,7 +130,8 @@ internal fun LibraryView(
} }
LibraryBottomSheetState.EDIT -> { LibraryBottomSheetState.EDIT -> {
EditBottomSheet(editInfoViewModel, EditBottomSheet(
editInfoViewModel,
deleteCurrentItem = { viewModel.currentItem.value = null }, deleteCurrentItem = { viewModel.currentItem.value = null },
{ viewModel.refresh() }, { viewModel.refresh() },
viewModel.currentSavedItemUnderEdit() viewModel.currentSavedItemUnderEdit()
@ -318,13 +314,15 @@ fun EditBottomSheet(
} }
@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class,
ExperimentalFoundationApi::class
)
@Composable @Composable
fun LibraryViewContent( fun LibraryViewContent(
itemsFilter: SavedItemFilter, itemsFilter: SavedItemFilter,
activeLabels: List<SavedItemLabel>, activeLabels: List<SavedItemLabel>,
sortFilter: SavedItemSortFilter, sortFilter: SavedItemSortFilter,
updateSavedItemFilter:(SavedItemFilter) -> Unit, updateSavedItemFilter: (SavedItemFilter) -> Unit,
updateSavedItemSortFilter: (SavedItemSortFilter) -> Unit, updateSavedItemSortFilter: (SavedItemSortFilter) -> Unit,
setBottomSheetState: (LibraryBottomSheetState) -> Unit, setBottomSheetState: (LibraryBottomSheetState) -> Unit,
updateAppliedLabels: (List<SavedItemLabel>) -> Unit, updateAppliedLabels: (List<SavedItemLabel>) -> Unit,
@ -415,6 +413,7 @@ fun LibraryViewContent(
true true
}) })
SwipeToDismiss( SwipeToDismiss(
modifier = Modifier.animateItemPlacement(),
state = swipeState, state = swipeState,
directions = setOf( directions = setOf(
DismissDirection.StartToEnd, DismissDirection.EndToStart DismissDirection.StartToEnd, DismissDirection.EndToStart
@ -535,7 +534,7 @@ fun InfiniteListHandler(
LaunchedEffect(loadMore) { LaunchedEffect(loadMore) {
snapshotFlow { loadMore.value }.distinctUntilChanged().collect { snapshotFlow { loadMore.value }.distinctUntilChanged().collect {
onLoadMore() onLoadMore()
} }
} }
} }

View File

@ -1,6 +1,7 @@
package app.omnivore.omnivore.feature.library package app.omnivore.omnivore.feature.library
import android.content.Intent import android.content.Intent
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -151,6 +152,7 @@ fun SearchView(
} }
} }
@OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun TypeaheadSearchViewContent(viewModel: SearchViewModel, modifier: Modifier) { fun TypeaheadSearchViewContent(viewModel: SearchViewModel, modifier: Modifier) {
val context = LocalContext.current val context = LocalContext.current
@ -169,8 +171,9 @@ fun TypeaheadSearchViewContent(viewModel: SearchViewModel, modifier: Modifier) {
.fillMaxSize() .fillMaxSize()
) { ) {
items(searchedCardsData) { cardData -> items(searchedCardsData, key = { it.savedItemId } ) { cardData ->
TypeaheadSearchCard( TypeaheadSearchCard(
modifier = Modifier.animateItemPlacement(),
cardData = cardData, cardData = cardData,
onClickHandler = { onClickHandler = {
// val activityClass = if (cardData.isPDF()) PDFReaderActivity::class.java else WebReaderLoadingContainerActivity::class.java // val activityClass = if (cardData.isPDF()) PDFReaderActivity::class.java else WebReaderLoadingContainerActivity::class.java