Add animateItemPlacement to LazyColumn items
This commit is contained in:
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user