diff --git a/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt b/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt index ab5f009bb..0afeb4169 100644 --- a/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt +++ b/app/src/main/java/com/london/app/navigation/graph/mainNavGraph.kt @@ -172,7 +172,7 @@ private fun NavGraphBuilder.onListNavGraph(navController: NavHostController) = appComposable { ListScreen( onNavigateToListDetails = ::navigateToListDetails, - onNavigateToLogin = ::navigateToLoginWithPopUp, + onNavigateToLogin = ::navigateToLogin, ) } appComposable { diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt index 774310ab4..22b79ed31 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/ActorDetailsScreen.kt @@ -134,7 +134,7 @@ private fun Content( LazyColumn( modifier = Modifier.fillMaxSize(), - contentPadding = PaddingValues(bottom = 16.dp), + contentPadding = PaddingValues(bottom = 24.dp), state = lazyState ) { item { diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt index 44a18f946..a7548ddf8 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/actor/TrendingActorsScreen.kt @@ -2,6 +2,7 @@ package com.london.presentation.feature.home.trending.actor import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -73,42 +74,48 @@ private fun Content( Box( modifier = Modifier.fillMaxSize() - ){ + ) { BackgroundGradient( - modifier = Modifier.align(Alignment.TopStart).zIndex(1f) + modifier = Modifier + .align(Alignment.TopStart) + .zIndex(1f) ) - LazyColumn( + Column ( modifier = Modifier .fillMaxSize() .padding(horizontal = 16.dp) - .background(color = NovixTheme.colors.surface), - contentPadding = PaddingValues(bottom = 16.dp) ) { - stickyHeader { - TopBar( - title = stringResource(R.string.trending_people), - onBackClick = contract::onBackClick, - modifier = Modifier - .fillMaxWidth() - .background(NovixTheme.colors.surface) - .padding(vertical = 12.dp) - ) - } + TopBar( + title = stringResource(R.string.trending_people), + onBackClick = contract::onBackClick, + modifier = Modifier + .fillMaxWidth() + .background(NovixTheme.colors.surface) + .padding(vertical = 12.dp) + ) + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .background(color = NovixTheme.colors.surface), + contentPadding = PaddingValues(bottom = 24.dp) + ) { - item { - LazyPagingColumn( - pagingItems = state.actorsFlow.collectAsLazyPagingItems(), - modifier = Modifier.fillMaxSize(), - itemContent = { actor -> - ActorItem( - actorName = actor.name, - characterName = null, - imageRes = actor.profilePictureUrl, - onClick = { contract.onActorClick(actor.id) } - ) - } - ) + item { + LazyPagingColumn( + pagingItems = state.actorsFlow.collectAsLazyPagingItems(), + modifier = Modifier.fillMaxSize(), + itemContent = { actor -> + ActorItem( + actorName = actor.name, + characterName = null, + imageRes = actor.profilePictureUrl, + onClick = { contract.onActorClick(actor.id) } + ) + } + ) + } } } } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt index 26f8696de..cb2902d90 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/movie/TrendingMoviesScreen.kt @@ -3,6 +3,7 @@ package com.london.presentation.feature.home.trending.movie import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -72,9 +73,11 @@ private fun Content( Box( modifier = Modifier.fillMaxSize() - ){ + ) { BackgroundGradient( - modifier = Modifier.align(Alignment.TopStart).zIndex(1f) + modifier = Modifier + .align(Alignment.TopStart) + .zIndex(1f) ) Column( modifier = Modifier @@ -107,7 +110,8 @@ private fun Content( .fillMaxWidth() .padding(horizontal = 16.dp), onSaveClick = { contract.onManageBookmarkClicked(it.id) }, - hasSaveIcon = true + hasSaveIcon = true, + contentPadding = PaddingValues(bottom = 24.dp) ) BookmarkBottomSheet( diff --git a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt index 069498a54..db4064a69 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/trending/tvshow/TrendingTvShowsScreen.kt @@ -3,6 +3,7 @@ package com.london.presentation.feature.home.trending.tvshow import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding @@ -73,9 +74,11 @@ private fun Content( Box( modifier = Modifier.fillMaxSize() - ){ + ) { BackgroundGradient( - modifier = Modifier.align(Alignment.TopStart).zIndex(1f) + modifier = Modifier + .align(Alignment.TopStart) + .zIndex(1f) ) Column( modifier = Modifier @@ -106,8 +109,9 @@ private fun Content( .weight(1f) .fillMaxWidth() .padding(horizontal = 16.dp), - onSaveClick = { /* TODO: Implement save functionality */ }, + onSaveClick = { }, isItemSaved = { false }, + contentPadding = PaddingValues(bottom = 24.dp) ) } } diff --git a/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt b/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt index 34c444605..62c6d6a37 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/upcoming/UpcomingSection.kt @@ -27,6 +27,7 @@ import com.london.presentation.feature.home.HomeScreenContract import com.london.presentation.feature.home.HomeScreenUiState import com.london.presentation.shared.GenresSection import com.london.presentation.shared.HomeCard +import com.london.presentation.shared.ShimmerMovieCard @Composable fun UpcomingSectionTitle(isLoading: Boolean) { @@ -102,13 +103,3 @@ fun UpcomingMovieItem( } } } - -@Composable -private fun ShimmerMovieCard() { - Box( - modifier = Modifier - .height(240.dp) - .clip(RoundedCornerShape(12.dp)) - .shimmerEffect() - ) -} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt index 69e1137eb..e1a23572a 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListViewModel.kt @@ -49,13 +49,9 @@ class ListViewModel @Inject constructor( override fun onListNameChanged(listName: TextFieldValue) = updateState { copy(addListSheetState = addListSheetState.copy(listName = listName)) } - override fun resetSnackBarErrorState() { - updateState { copy(isSnackBarSuccessVisible = false) } - } + override fun resetSnackBarErrorState() = updateState { copy(error = null) } - override fun resetSnackBarSuccessState() { - updateState { copy(error = null) } - } + override fun resetSnackBarSuccessState() = updateState { copy(isSnackBarSuccessVisible = false) } override fun onAddList(listName: String) { tryToExecute( diff --git a/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt b/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt index cb8793e5c..a23e2b368 100644 --- a/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt +++ b/presentation/src/main/java/com/london/presentation/shared/HomeCard.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.border import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape @@ -34,7 +35,8 @@ fun HomeCard( hasSaveIcon: Boolean = true, onDeleteClick: () -> Unit = {}, imageDescription: String? = null, - hasOverlay: Boolean = false + hasOverlay: Boolean = false, + isLoadingShimmer: Boolean = false ) { Box( modifier = Modifier @@ -56,7 +58,14 @@ fun HomeCard( modifier = Modifier.matchParentSize(), contentScale = ContentScale.Crop, errorContent = { ErrorImage() }, - loadingContent = { CircularLoading(modifier = Modifier.align(Alignment.Center)) }, + loadingContent = { + if (isLoadingShimmer) ShimmerMovieCard( + modifier = Modifier + .fillMaxSize() + .align(Alignment.Center) + ) + else CircularLoading(modifier = Modifier.align(Alignment.Center)) + }, moderatedContent = { UnSuitableEye() } ) if (hasSaveIcon) diff --git a/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt b/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt index 0934df697..aa38d2887 100644 --- a/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt +++ b/presentation/src/main/java/com/london/presentation/shared/MediaLazyPagingGrid.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.paging.compose.LazyPagingItems import com.london.presentation.utils.gridColumns +import com.london.presentation.utils.isNotLoading @Deprecated( message = "Use MediaLazyVerticalGrid or MediaLazyGridWithFilter instead. This composable will be removed in a future version. Note: Both have two overloads - one for List and one for LazyPagingItems.", @@ -59,6 +60,7 @@ fun MediaLazyPagingGrid( onSaveClick: (T) -> Unit = {}, isItemSaved: (T) -> Boolean = { false }, hasSaveIcon: Boolean = false, + contentPadding: PaddingValues = PaddingValues(bottom = 16.dp) ) { LazyVerticalGrid( state = rememberLazyGridState(), @@ -66,7 +68,7 @@ fun MediaLazyPagingGrid( modifier = modifier.fillMaxSize(), horizontalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp), - contentPadding = PaddingValues(bottom = 16.dp) + contentPadding = contentPadding ) { items(pagingFlow.itemCount) { index -> val item = pagingFlow[index] @@ -77,7 +79,8 @@ fun MediaLazyPagingGrid( onSaveClick = { onSaveClick(item) }, isSaved = isItemSaved(item), imageDescription = getTitle(item), - modifier = Modifier.clickable { onItemClick(item) } + modifier = Modifier.clickable { onItemClick(item) }, + isLoadingShimmer = true ) } } diff --git a/presentation/src/main/java/com/london/presentation/shared/shimmerMovieCard.kt b/presentation/src/main/java/com/london/presentation/shared/shimmerMovieCard.kt new file mode 100644 index 000000000..93f9812ee --- /dev/null +++ b/presentation/src/main/java/com/london/presentation/shared/shimmerMovieCard.kt @@ -0,0 +1,20 @@ +package com.london.presentation.shared + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.london.designsystem.utils.shimmerEffect + +@Composable +fun ShimmerMovieCard(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .height(240.dp) + .clip(RoundedCornerShape(12.dp)) + .shimmerEffect() + ) +} diff --git a/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt b/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt index 7274cb6dd..65686ab3d 100644 --- a/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt +++ b/presentation/src/main/java/com/london/presentation/utils/pagingExtensions.kt @@ -20,4 +20,6 @@ fun LazyPagingItems.isEmpty(): Boolean = itemSnapshotList.isEmpty() fun LazyPagingItems.isLoading(): Boolean = loadState.refresh is LoadState.Loading +fun LazyPagingItems.isNotLoading(): Boolean = loadState.refresh !is LoadState.Loading + fun LazyPagingItems.isError(): Boolean = loadState.refresh is LoadState.Error