From 21acc288846c531cce40831901e6eafe29676a93 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 21 Aug 2025 15:56:49 +0300 Subject: [PATCH 01/10] refactor: rename ListScreen to ListsScreen --- .../main/java/com/london/app/navigation/graph/mainNavGraph.kt | 4 ++-- .../feature/list/savedlist/{ListScreen.kt => ListsScreen.kt} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename presentation/src/main/java/com/london/presentation/feature/list/savedlist/{ListScreen.kt => ListsScreen.kt} (99%) 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 83c4f22fc..e9fc71558 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 @@ -46,7 +46,7 @@ import com.london.presentation.feature.home.toprated.TopRatedScreen import com.london.presentation.feature.home.trending.actor.TrendingActorsScreen import com.london.presentation.feature.home.trending.movie.TrendingMoviesScreen import com.london.presentation.feature.home.trending.tvshow.TrendingTvShowsScreen -import com.london.presentation.feature.list.savedlist.ListScreen +import com.london.presentation.feature.list.savedlist.ListsScreen import com.london.presentation.feature.list.viewitems.ViewListItemsScreen import com.london.presentation.feature.reviews.ReviewsScreen import com.london.presentation.feature.search.SearchScreen @@ -170,7 +170,7 @@ private fun NavGraphBuilder.continueWatchingNavGraph(navController: NavHostContr private fun NavGraphBuilder.onListNavGraph(navController: NavHostController) = with(navController) { appComposable { - ListScreen( + ListsScreen( onNavigateToListDetails = ::navigateToListDetails, onNavigateToLogin = ::navigateToLogin, ) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt similarity index 99% rename from presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt index 2274d99a2..52fc7bbec 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt @@ -57,7 +57,7 @@ import com.london.presentation.utils.Listen import com.london.presentation.utils.toLocalizedNumbers @Composable -fun ListScreen( +fun ListsScreen( onNavigateToLogin: () -> Unit, onNavigateToListDetails: (Int) -> Unit, viewModel: ListViewModel = hiltViewModel() From 88c403dce2ef443e2b91eba2df4c6e4cfc7ac4e8 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 21 Aug 2025 18:24:56 +0300 Subject: [PATCH 02/10] refactor: Improve code structure and naming --- .../feature/list/savedlist/ListsScreen.kt | 131 +++++++----------- 1 file changed, 49 insertions(+), 82 deletions(-) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt index 52fc7bbec..892a00a38 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt @@ -15,6 +15,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -29,7 +30,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.scale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel @@ -44,7 +44,6 @@ import com.london.designsystem.component.button.OutlineButton import com.london.designsystem.snackbar.LocalSnackbarController import com.london.designsystem.snackbar.SnackBarType import com.london.designsystem.theme.NovixTheme -import com.london.designsystem.theme.ThemePreviews import com.london.designsystem.utils.painter import com.london.designsystem.utils.string import com.london.domain.entity.movie.MovieList @@ -83,7 +82,7 @@ private fun Content( state: ListUiState, contract: ListContract, ) { - val pagingItems = state.items.collectAsLazyPagingItems() + val listsFlow = state.items.collectAsLazyPagingItems() Box( modifier = Modifier.fillMaxSize() @@ -93,17 +92,14 @@ private fun Content( onRetry = contract::onRetry, isLoading = state.isLoading, isError = state.error is ErrorState.NoInternet, - pagingFlow = pagingItems, + pagingFlow = listsFlow, isGuest = state.isGuest, - guestContent = { NoListFoundAsGuest(onLoginClick = contract::onLoginClick) }, + guestContent = { LoginPromptForList(onLoginClick = contract::onLoginClick) }, emptyContent = { EmptyList(contract = contract, addListSheetState = state.addListSheetState) }, handlePagingLoadingAutomatically = true ) { - BackgroundGradient( - modifier = Modifier - .align(Alignment.TopStart) - ) + BackgroundGradient(modifier = Modifier.align(Alignment.TopStart)) LazyColumn( modifier = Modifier.fillMaxSize(), @@ -117,14 +113,12 @@ private fun Content( modifier = Modifier.padding(vertical = 12.dp) ) } - items(pagingItems.itemCount) { index -> - val item = pagingItems[index] - item?.let { - SavedListItemRow( - itemUi = item, - onCountClick = contract::onListClick - ) - } + + items(listsFlow.itemSnapshotList.items) { list -> + SavedListComponent( + movieList = list, + onListClick = contract::onListClick + ) } } @@ -158,22 +152,19 @@ private fun Content( @Composable private fun ScreenScaffold( - titleRes: Int, - showFab: Boolean = true, onFabClick: (() -> Unit)? = null, content: @Composable () -> Unit, ) { - Box( modifier = Modifier.fillMaxSize() ) { content() - if (showFab && onFabClick != null) { + onFabClick?.let { FloatingActionButton( modifier = Modifier .align(Alignment.BottomEnd) - .padding(bottom = 16.dp, end = 16.dp), + .padding(bottom = 116.dp, end = 16.dp), onClick = onFabClick, isLoadingIcon = false, isDisabledIcon = false, @@ -181,19 +172,18 @@ private fun ScreenScaffold( ) } } - } @Composable -private fun SavedListItemRow( - itemUi: MovieList, - onCountClick: (Int) -> Unit +private fun SavedListComponent( + movieList: MovieList, + onListClick: (Int) -> Unit ) { Row( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .clickable { onCountClick(itemUi.id) } + .clickable { onListClick(movieList.id) } .background(NovixTheme.colors.surface) .border( width = 1.dp, @@ -204,23 +194,21 @@ private fun SavedListItemRow( .zIndex(2f) ) { Text( - text = itemUi.name, + text = movieList.name, + modifier = Modifier.weight(1f), style = NovixTheme.typography.title.medium, color = NovixTheme.colors.title, maxLines = 1, - modifier = Modifier - .weight(1f) ) + ItemCount( - itemUi = itemUi, + count = movieList.moviesCount, ) } } @Composable -private fun ItemCount( - itemUi: MovieList, -) { +private fun ItemCount(count: Int) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), @@ -230,7 +218,7 @@ private fun ItemCount( .padding(horizontal = 8.dp, vertical = 4.dp) ) { Text( - text = itemUi.moviesCount.toLocalizedNumbers(), + text = count.toLocalizedNumbers(), style = NovixTheme.typography.label.small, color = NovixTheme.colors.primary, ) @@ -247,11 +235,7 @@ private fun EmptyList( contract: ListContract, addListSheetState: AddSheetState ) { - ScreenScaffold( - titleRes = R.string.saved_list_title, - onFabClick = contract::onFabClick, - showFab = true, - ) { + ScreenScaffold(onFabClick = contract::onFabClick) { Box( modifier = Modifier .fillMaxSize() @@ -276,38 +260,33 @@ private fun EmptyList( } @Composable -private fun NoListFoundAsGuest( +private fun LoginPromptForList( onLoginClick: () -> Unit, modifier: Modifier = Modifier ) { - ScreenScaffold( - titleRes = R.string.saved_list_title, - showFab = false + Box( + modifier = Modifier.fillMaxSize() ) { - Box( - modifier = Modifier.fillMaxSize() - ) { - EmptyLayout( - modifier = modifier - .padding(horizontal = 16.dp) - .align(Alignment.Center), - text = stringResource(R.string.login_to_create_list), - imageContent = { - BlurredImage(imageId = R.drawable.ic_no_saved_list_as_guest) - }, - additionalContent = { - OutlineButton( - text = stringResource(R.string.login), - hasLabel = true, - icon = null, - hasIcon = false, - isLoading = false, - onClick = onLoginClick, - modifier = Modifier.padding(top = 16.dp) - ) - } - ) - } + EmptyLayout( + modifier = modifier + .padding(horizontal = 16.dp) + .align(Alignment.Center), + text = stringResource(R.string.login_to_create_list), + imageContent = { + BlurredImage(imageId = R.drawable.ic_no_saved_list_as_guest) + }, + additionalContent = { + OutlineButton( + text = stringResource(R.string.login), + hasLabel = true, + icon = null, + hasIcon = false, + isLoading = false, + onClick = onLoginClick, + modifier = Modifier.padding(top = 16.dp) + ) + } + ) } } @@ -339,24 +318,12 @@ private fun BlurredImage(@DrawableRes imageId: Int) { contentDescription = null ) } + Image( - painter = painterResource(id = imageId), + painter = imageId.painter, contentDescription = "List Image", modifier = Modifier .size(128.dp), ) } } - -@Composable -@Preview -@ThemePreviews -private fun Preview() { - NovixTheme { - val state = ListUiState() - Content( - state = state, - contract = defaultContractList() - ) - } -} From ca0c6223942820fc08c83d12876440f0b4ddc234 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Fri, 22 Aug 2025 10:31:15 +0300 Subject: [PATCH 03/10] refactor: improve list screen layout, rename components, and enhance UI consistency --- .../feature/list/savedlist/ListsScreen.kt | 166 ++++++++++-------- 1 file changed, 92 insertions(+), 74 deletions(-) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt index 892a00a38..7d744e084 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize @@ -15,7 +17,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -53,6 +54,7 @@ import com.london.presentation.shared.BackgroundGradient import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen +import com.london.presentation.utils.navBarBottomPadding import com.london.presentation.utils.toLocalizedNumbers @Composable @@ -82,46 +84,63 @@ private fun Content( state: ListUiState, contract: ListContract, ) { - val listsFlow = state.items.collectAsLazyPagingItems() + val pagingItems = state.items.collectAsLazyPagingItems() Box( - modifier = Modifier.fillMaxSize() + modifier = Modifier + .fillMaxSize() + .navBarBottomPadding() ) { BuildScreen( onRetry = contract::onRetry, isLoading = state.isLoading, isError = state.error is ErrorState.NoInternet, - pagingFlow = listsFlow, + pagingFlow = pagingItems, isGuest = state.isGuest, - guestContent = { LoginPromptForList(onLoginClick = contract::onLoginClick) }, - emptyContent = { EmptyList(contract = contract, addListSheetState = state.addListSheetState) }, + guestContent = { NoListFoundAsGuest(onLoginClick = contract::onLoginClick) }, + emptyContent = { + EmptyList( + contract = contract, + addListSheetState = state.addListSheetState + ) + }, handlePagingLoadingAutomatically = true ) { - BackgroundGradient(modifier = Modifier.align(Alignment.TopStart)) + BackgroundGradient( + modifier = Modifier + .align(Alignment.TopStart) + ) - LazyColumn( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.spacedBy(8.dp), - contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp) + Column( + modifier = Modifier.padding(horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) ) { + TopBar( + title = stringResource(R.string.saved_list_title), + modifier = Modifier.padding(vertical = 12.dp) + ) - stickyHeader { - TopBar( - title = stringResource(R.string.saved_list_title), - modifier = Modifier.padding(vertical = 12.dp) - ) - } - - items(listsFlow.itemSnapshotList.items) { list -> - SavedListComponent( - movieList = list, - onListClick = contract::onListClick - ) + LazyColumn( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(8.dp), + contentPadding = PaddingValues(vertical = 8.dp) + ) { + items(pagingItems.itemCount) { index -> + val item = pagingItems[index] + item?.let { + SavedListItemRow( + itemUi = item, + onCountClick = contract::onListClick + ) + } + } } } + ListFAB(contract::onFabClick) + AddListBottomSheet( addListInteractions = contract, addListSheetState = state.addListSheetState @@ -151,39 +170,30 @@ private fun Content( } @Composable -private fun ScreenScaffold( - onFabClick: (() -> Unit)? = null, - content: @Composable () -> Unit, +fun BoxScope.ListFAB( + onFabClick: () -> Unit ) { - Box( - modifier = Modifier.fillMaxSize() - ) { - content() - - onFabClick?.let { - FloatingActionButton( - modifier = Modifier - .align(Alignment.BottomEnd) - .padding(bottom = 116.dp, end = 16.dp), - onClick = onFabClick, - isLoadingIcon = false, - isDisabledIcon = false, - isDefaultIcon = true - ) - } - } + FloatingActionButton( + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(bottom = 16.dp, end = 16.dp), + onClick = onFabClick, + isLoadingIcon = false, + isDisabledIcon = false, + isDefaultIcon = true + ) } @Composable -private fun SavedListComponent( - movieList: MovieList, - onListClick: (Int) -> Unit +private fun SavedListItemRow( + itemUi: MovieList, + onCountClick: (Int) -> Unit ) { Row( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .clickable { onListClick(movieList.id) } + .clickable { onCountClick(itemUi.id) } .background(NovixTheme.colors.surface) .border( width = 1.dp, @@ -194,21 +204,23 @@ private fun SavedListComponent( .zIndex(2f) ) { Text( - text = movieList.name, - modifier = Modifier.weight(1f), + text = itemUi.name, style = NovixTheme.typography.title.medium, color = NovixTheme.colors.title, maxLines = 1, + modifier = Modifier + .weight(1f) ) - ItemCount( - count = movieList.moviesCount, + itemUi = itemUi, ) } } @Composable -private fun ItemCount(count: Int) { +private fun ItemCount( + itemUi: MovieList, +) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), @@ -218,7 +230,7 @@ private fun ItemCount(count: Int) { .padding(horizontal = 8.dp, vertical = 4.dp) ) { Text( - text = count.toLocalizedNumbers(), + text = itemUi.moviesCount.toLocalizedNumbers(), style = NovixTheme.typography.label.small, color = NovixTheme.colors.primary, ) @@ -235,38 +247,45 @@ private fun EmptyList( contract: ListContract, addListSheetState: AddSheetState ) { - ScreenScaffold(onFabClick = contract::onFabClick) { - Box( - modifier = Modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - ) { - EmptyLayout( - modifier = Modifier - .padding(horizontal = 16.dp) - .align(Alignment.Center), - text = stringResource(R.string.no_saved_list), - imageContent = { - BlurredImage(imageId = R.drawable.ic_no_saved_list_yet) - }, - ) - } + Box(modifier = Modifier.fillMaxSize()) { + TopBar( + title = R.string.saved_list_title.string, + modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp) + ) - AddListBottomSheet( - addListInteractions = contract, - addListSheetState = addListSheetState + EmptyLayout( + modifier = Modifier + .padding(horizontal = 16.dp) + .align(Alignment.Center) + .verticalScroll(rememberScrollState()), + text = stringResource(R.string.no_saved_list), + imageContent = { + BlurredImage(imageId = R.drawable.ic_no_saved_list_yet) + }, ) + + ListFAB(contract::onFabClick) } + + AddListBottomSheet( + addListInteractions = contract, + addListSheetState = addListSheetState + ) } @Composable -private fun LoginPromptForList( +private fun NoListFoundAsGuest( onLoginClick: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = Modifier.fillMaxSize() ) { + TopBar( + title = R.string.saved_list_title.string, + modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp) + ) + EmptyLayout( modifier = modifier .padding(horizontal = 16.dp) @@ -318,7 +337,6 @@ private fun BlurredImage(@DrawableRes imageId: Int) { contentDescription = null ) } - Image( painter = imageId.painter, contentDescription = "List Image", From dd230ef5d49bfdc348ea4d3f39a8f401ee137f50 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Fri, 22 Aug 2025 17:13:27 +0300 Subject: [PATCH 04/10] Refactor: Move BackgroundGradient to designSystem module --- .../component}/BackgroundGradient.kt | 2 +- .../designsystem/component/EmptyLayout.kt | 55 +++++++++++-------- .../feature/account/AccountScreen.kt | 2 +- .../feature/account/rating/MyRatingScreen.kt | 2 +- .../authentication/login/LoginScreen.kt | 2 +- .../feature/category/main/CategoriesScreen.kt | 2 +- .../category/movie/MovieCategoryScreen.kt | 2 +- .../category/tvshow/TvShowCategoryScreen.kt | 2 +- .../details/actor/ActorDetailsScreen.kt | 2 +- .../actor/info/gallery/ActorsGalleryScreen.kt | 2 +- .../topmoviespicks/TopMoviesPicksScreen.kt | 2 +- .../toptvshowspicks/TopTvShowsPicksScreen.kt | 2 +- .../details/movie/MovieDetailsScreen.kt | 2 +- .../tvshow/episode/EpisodeDetailScreen.kt | 2 +- .../details/tvshow/info/TvShowDetailScreen.kt | 2 +- .../presentation/feature/home/HomeScreen.kt | 2 +- .../ContinueWatchingScreen.kt | 5 +- .../feature/home/toprated/TopRatedScreen.kt | 2 +- .../trending/actor/TrendingActorsScreen.kt | 7 +-- .../trending/movie/TrendingMoviesScreen.kt | 3 +- .../trending/tvshow/TrendingTvShowsScreen.kt | 2 +- .../feature/list/savedlist/ListsScreen.kt | 2 +- .../feature/list/viewitems/ViewItemsScreen.kt | 2 +- .../feature/reviews/ReviewsScreen.kt | 2 +- .../feature/search/SearchScreen.kt | 2 +- .../shared/buildscreen/LoadingScreen.kt | 6 ++ .../shared/buildscreen/NetworkErrorScreen.kt | 6 ++ 27 files changed, 68 insertions(+), 56 deletions(-) rename {presentation/src/main/java/com/london/presentation/shared => designSystem/src/main/java/com/london/designsystem/component}/BackgroundGradient.kt (97%) diff --git a/presentation/src/main/java/com/london/presentation/shared/BackgroundGradient.kt b/designSystem/src/main/java/com/london/designsystem/component/BackgroundGradient.kt similarity index 97% rename from presentation/src/main/java/com/london/presentation/shared/BackgroundGradient.kt rename to designSystem/src/main/java/com/london/designsystem/component/BackgroundGradient.kt index d72b1f346..e5884ac4d 100644 --- a/presentation/src/main/java/com/london/presentation/shared/BackgroundGradient.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/BackgroundGradient.kt @@ -1,4 +1,4 @@ -package com.london.presentation.shared +package com.london.designsystem.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt index 42459d685..1bd3f234b 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt @@ -4,6 +4,7 @@ import androidx.annotation.DrawableRes import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement.Center +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth @@ -11,6 +12,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale @@ -25,31 +27,38 @@ fun EmptyLayout( modifier: Modifier = Modifier, @DrawableRes image: Int? = null ) { - Column( - modifier = modifier - .fillMaxSize() - .background(NovixTheme.colors.surface), - horizontalAlignment = CenterHorizontally, - verticalArrangement = Center - ) { - image?.let { - Image( - painter = painterResource(id = it), - contentDescription = "Search Icon", - modifier = Modifier - .size(128.dp) - .align(CenterHorizontally), - contentScale = ContentScale.Fit + Box { + BackgroundGradient( + modifier = Modifier + .align(Alignment.TopStart) + ) + + Column( + modifier = modifier + .fillMaxSize() + .background(NovixTheme.colors.surface), + horizontalAlignment = CenterHorizontally, + verticalArrangement = Center + ) { + image?.let { + Image( + painter = painterResource(id = it), + contentDescription = "Search Icon", + modifier = Modifier + .size(128.dp) + .align(CenterHorizontally), + contentScale = ContentScale.Fit + ) + } + + Text( + text = text, + style = NovixTheme.typography.body.small, + color = NovixTheme.colors.body, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() ) } - - Text( - text = text, - style = NovixTheme.typography.body.small, - color = NovixTheme.colors.body, - textAlign = TextAlign.Center, - modifier = Modifier.fillMaxWidth() - ) } } diff --git a/presentation/src/main/java/com/london/presentation/feature/account/AccountScreen.kt b/presentation/src/main/java/com/london/presentation/feature/account/AccountScreen.kt index e67a9282e..ee250fcb0 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/AccountScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/AccountScreen.kt @@ -23,7 +23,7 @@ import com.london.presentation.feature.account.bottomsheet.LanguageBottomSheet import com.london.presentation.feature.account.bottomsheet.LogoutBottomSheet import com.london.presentation.feature.account.components.LoggedInContent import com.london.presentation.feature.account.components.NotLoggedInContent -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen import com.london.presentation.utils.navBarBottomPadding diff --git a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt index 8faeb8833..e6ee0d267 100644 --- a/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/account/rating/MyRatingScreen.kt @@ -24,7 +24,7 @@ import com.london.designsystem.theme.NovixTheme import com.london.designsystem.theme.ThemePreviews import com.london.domain.entity.shared.MediaType import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.EmptyGenreLayout import com.london.presentation.shared.SnackBarAnimation import com.london.presentation.shared.base.ErrorState diff --git a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginScreen.kt b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginScreen.kt index 41f44b304..bc02d8cfe 100644 --- a/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/authentication/login/LoginScreen.kt @@ -40,7 +40,7 @@ import com.london.designsystem.component.TopBar import com.london.designsystem.component.button.PrimaryButton import com.london.designsystem.theme.NovixTheme import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.SnackBarAnimation import com.london.presentation.shared.base.ErrorState import com.london.presentation.utils.Listen diff --git a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt index 8ccd45409..c7b054c36 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/main/CategoriesScreen.kt @@ -32,7 +32,7 @@ import com.london.designsystem.component.TopBar import com.london.designsystem.theme.ThemePreviews import com.london.designsystem.utils.string import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.CategoriesItem import com.london.presentation.shared.MediaCategory import com.london.presentation.shared.genre.MovieGenreUi diff --git a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt index e5c160e0e..e563fcade 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/movie/MovieCategoryScreen.kt @@ -19,7 +19,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar import com.london.designsystem.theme.ThemePreviews import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.MediaLazyVerticalGrid diff --git a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt index 7738eb358..bed0f31c6 100644 --- a/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/category/tvshow/TvShowCategoryScreen.kt @@ -19,7 +19,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar import com.london.designsystem.theme.ThemePreviews import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.MediaLazyVerticalGrid import com.london.presentation.utils.Listen 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 949869c06..5a9bd26ae 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 @@ -52,7 +52,7 @@ import com.london.designsystem.component.button.ErrorImage import com.london.designsystem.theme.NovixTheme import com.london.domain.entity.actor.ActorMediaItems import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ConditionalText import com.london.presentation.shared.CustomBackDropImagePager import com.london.presentation.shared.HomeCard diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt index f4fc8579a..24e734076 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/gallery/ActorsGalleryScreen.kt @@ -30,7 +30,7 @@ import com.london.designsystem.component.TopBar import com.london.designsystem.component.button.ErrorImage import com.london.designsystem.theme.NovixTheme import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ImageView import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksScreen.kt index 9a77121ca..281d7bea4 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/topmoviespicks/TopMoviesPicksScreen.kt @@ -15,7 +15,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.london.designsystem.component.TopBar import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet import com.london.presentation.shared.buildscreen.BuildScreen diff --git a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksScreen.kt index 226b42681..a08b0ec9c 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/actor/info/toptvshowspicks/TopTvShowsPicksScreen.kt @@ -15,7 +15,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.london.designsystem.component.TopBar import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.MediaLazyVerticalGrid diff --git a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt index de2cf1818..37bf2bc66 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/movie/MovieDetailsScreen.kt @@ -64,7 +64,7 @@ import com.london.presentation.R.string.more_like_this import com.london.presentation.R.string.overview import com.london.presentation.R.string.view_reviews import com.london.presentation.shared.ActorItem -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ConditionalText import com.london.presentation.shared.CustomBackDropImagePager import com.london.presentation.shared.FooterSection diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt index 2703f0100..53aaa82bc 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/episode/EpisodeDetailScreen.kt @@ -45,7 +45,7 @@ import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.presentation.R import com.london.presentation.shared.ActorItem -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ConditionalText import com.london.presentation.shared.CustomBackDropImagePager import com.london.presentation.shared.FooterSection diff --git a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt index 314ad5005..6d36bd379 100644 --- a/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/details/tvshow/info/TvShowDetailScreen.kt @@ -63,7 +63,7 @@ import com.london.domain.entity.shared.MediaType import com.london.domain.entity.tvshow.cast.TvShowCastMember import com.london.domain.entity.tvshow.episode.Episodes import com.london.presentation.shared.ActorItem -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ConditionalText import com.london.presentation.shared.CustomBackDropImagePager import com.london.presentation.shared.FooterSection diff --git a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt index 10bdfbc71..1fc840d36 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/HomeScreen.kt @@ -53,7 +53,7 @@ import com.london.presentation.feature.home.trending.TrendingSection import com.london.presentation.feature.home.upcoming.UpcomingMovieItem import com.london.presentation.feature.home.upcoming.UpcomingSectionTitle import com.london.presentation.feature.home.upcoming.UpcomingStickyHeader -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.CarousalShimmerEffect import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet import com.london.presentation.shared.buildscreen.NetworkErrorScreen diff --git a/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingScreen.kt index 05806cd0b..30aa0817b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/continuewatching/ContinueWatchingScreen.kt @@ -4,15 +4,12 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -20,7 +17,7 @@ import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.domain.entity.movie.Movie import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.MediaCategory import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet diff --git a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt index f522e02a3..981c1a48b 100644 --- a/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/home/toprated/TopRatedScreen.kt @@ -34,7 +34,7 @@ import com.london.designsystem.component.TabLayout import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.designsystem.utils.string -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.HomeCard import com.london.presentation.shared.MediaCategory import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet 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 e3f7b5c30..eb5a686dc 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 @@ -3,11 +3,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.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -15,7 +11,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -24,7 +19,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.ActorLazyVerticalColumn import com.london.presentation.utils.Listen 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 b17a82b50..534b78753 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,7 +3,6 @@ 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 @@ -25,7 +24,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.GenresSection import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet import com.london.presentation.shared.buildscreen.BuildScreen 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 f1cb8598a..147ebae8d 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 @@ -24,7 +24,7 @@ import androidx.paging.compose.collectAsLazyPagingItems import com.london.designsystem.component.TopBar import com.london.designsystem.theme.NovixTheme import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.GenresSection import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.MediaLazyVerticalGrid diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt index 7d744e084..7ba8b5774 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt @@ -50,7 +50,7 @@ import com.london.designsystem.utils.string import com.london.domain.entity.movie.MovieList import com.london.presentation.R import com.london.presentation.feature.list.bottomsheets.AddListBottomSheet -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.utils.Listen diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt index 2164086bb..5b96236bc 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt @@ -22,7 +22,7 @@ import com.london.designsystem.theme.ThemePreviews import com.london.designsystem.utils.string import com.london.presentation.R import com.london.presentation.feature.list.bottomsheets.DeleteListBottomSheet -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.buildscreen.BuildScreen import com.london.presentation.shared.container.MediaLazyVerticalGrid diff --git a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt index e8f32cec7..7ff0195ef 100644 --- a/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/reviews/ReviewsScreen.kt @@ -43,7 +43,7 @@ import com.london.designsystem.component.button.ErrorImage import com.london.designsystem.theme.NovixTheme import com.london.domain.entity.review.Review import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.ConditionalText import com.london.presentation.shared.ImageView import com.london.presentation.shared.RatingItem diff --git a/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt b/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt index b3f5367eb..94d0393f8 100644 --- a/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/search/SearchScreen.kt @@ -60,7 +60,7 @@ import com.london.domain.entity.recent.RecentViewed import com.london.domain.entity.shared.MediaType import com.london.domain.entity.shared.MediaType.Companion.isMovie import com.london.presentation.R -import com.london.presentation.shared.BackgroundGradient +import com.london.designsystem.component.BackgroundGradient import com.london.presentation.shared.HomeCard import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.bookmarkSheet.BookmarkBottomSheet diff --git a/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt b/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt index 83da668f5..d671696ea 100644 --- a/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt +++ b/presentation/src/main/java/com/london/presentation/shared/buildscreen/LoadingScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.london.designsystem.component.CircularLoading +import com.london.designsystem.component.BackgroundGradient @Composable fun LoadingScreen() { @@ -13,6 +14,11 @@ fun LoadingScreen() { modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { + BackgroundGradient( + modifier = Modifier + .align(Alignment.TopStart) + ) + CircularLoading() } } diff --git a/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt b/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt index ab9f714fb..7473af906 100644 --- a/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt +++ b/presentation/src/main/java/com/london/presentation/shared/buildscreen/NetworkErrorScreen.kt @@ -19,6 +19,7 @@ import com.london.designsystem.component.Text import com.london.designsystem.component.TopBar import com.london.designsystem.component.button.OutlineButton import com.london.designsystem.theme.NovixTheme +import com.london.designsystem.component.BackgroundGradient @Composable fun NetworkErrorScreen( @@ -30,6 +31,11 @@ fun NetworkErrorScreen( modifier .padding(horizontal = 16.dp) ) { + BackgroundGradient( + modifier = Modifier + .align(Alignment.TopStart) + ) + if (onBack != null) { TopBar( onBackClick = onBack, From e2d14d9d5cb73a63a8f8004bd86824b09eeaeb4a Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 16:38:13 +0300 Subject: [PATCH 05/10] refactor: standardize "Login" spelling in strings This commit updates the spelling of "Log In" to "Login" across various string resources for consistency. Changed strings: - `login_to_create_list` - `login_to_add_list` - `login` - `login_to_your_account` - `please_login_to_access` - `logout` (changed from "Log Out") --- presentation/src/main/res/values/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 21cc538ce..9eeb5c918 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -62,8 +62,8 @@ No saved lists yet, tap + to create one No lists available for this item\nCreate one now - Please log in to create and manage your lists - Please log in to save to lists + Please login to create and manage your lists + Please login to save to lists @@ -110,12 +110,12 @@ - Log In + Login Password Forgot Password? Username - Log in to your account + Login to your account Continue as Guest Don\'t have an account? @@ -127,13 +127,13 @@ My Account - Please log in to access your account details and features + Please login to access your account details and features Watching History User Profile Change Password - Log Out + Logout Are you sure you want to continue? From b3ac2e743ca5cfbac89d42f3b5a8f3ab206c3b7e Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 19:13:44 +0300 Subject: [PATCH 06/10] refactor: update "What to watch?" string This commit updates the `what_to_watch` string resource in `presentation/src/main/res/values/strings.xml` to "What to watch?" for brevity. --- presentation/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 9eeb5c918..4bac14905 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -9,7 +9,7 @@ - What you want to watch? + What to watch? Born from Nova, Made for Flix. Celebrities Top Rated From 0dce3b9196620a7099376b2bdf5bb3f2995b3e87 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 19:14:20 +0300 Subject: [PATCH 07/10] refactor: update EmptyLayout component This commit updates the `EmptyLayout` composable function. - It now wraps its content within a `Box` layout. - A `BackgroundGradient` is added at the top start of the `Box`. - The `imageContent` and `additionalContent` lambdas are now invoked using `invoke()`. --- .../designsystem/component/EmptyLayout.kt | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt index 1bd3f234b..0c02b0851 100644 --- a/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt +++ b/designSystem/src/main/java/com/london/designsystem/component/EmptyLayout.kt @@ -69,23 +69,30 @@ fun EmptyLayout( imageContent: (@Composable () -> Unit)? = null, additionalContent: (@Composable () -> Unit)? = null ) { - Column( - modifier = modifier - .fillMaxWidth() - .background(NovixTheme.colors.surface), - horizontalAlignment = CenterHorizontally, - verticalArrangement = Center - ) { - imageContent?.let { it() } - - Text( - text = text, - style = NovixTheme.typography.body.small, - color = NovixTheme.colors.body, - textAlign = TextAlign.Center, - modifier = Modifier.padding(horizontal = 48.dp, vertical = 12.dp) + Box { + BackgroundGradient( + modifier = Modifier + .align(Alignment.TopStart) ) - additionalContent?.let { it() } + Column( + modifier = modifier + .fillMaxWidth() + .background(NovixTheme.colors.surface), + horizontalAlignment = CenterHorizontally, + verticalArrangement = Center + ) { + imageContent?.invoke() + + Text( + text = text, + style = NovixTheme.typography.body.small, + color = NovixTheme.colors.body, + textAlign = TextAlign.Center, + modifier = Modifier.padding(horizontal = 48.dp, vertical = 12.dp) + ) + + additionalContent?.invoke() + } } } From 666797f61a2eed93e5d50de5f1c5661d6577db81 Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 19:15:13 +0300 Subject: [PATCH 08/10] refactor: enhance ListUiState with error snackbar visibility This commit introduces a new field `isSnackBarErrorVisible` to the `ListUiState` data class. This boolean flag will be used to control the visibility of an error snackbar in the list feature, providing users with feedback when an operation fails. --- .../london/presentation/feature/list/savedlist/ListUiState.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt index e6101cf60..f8c16a82d 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListUiState.kt @@ -12,6 +12,7 @@ data class ListUiState( val error: ErrorState? = null, val isLoading: Boolean = false, val isSnackBarSuccessVisible: Boolean = false, + val isSnackBarErrorVisible: Boolean = false, val items: Flow> = flow {}, val addListSheetState: AddSheetState = AddSheetState(), ) From 6bceb1a92220c54db277fd69ce13cf4f335b491f Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 19:38:04 +0300 Subject: [PATCH 09/10] refactor: rename ViewItems to MovieListDetails This commit refactors the `ViewItems` feature to `MovieListDetails` for better clarity and consistency. Key changes: - Renamed classes: - `ViewItemsScreen.kt` to `MovieListDetailsScreen.kt` - `ViewItemsViewModel.kt` to `MovieListDetailsViewModel.kt` - `ViewItemsContract.kt` to `MovieListDetailsContract.kt` - `ViewItemsUiState.kt` to `MovieListUiState.kt` - `ViewItemsEffect.kt` to `MovieListEffect.kt` - Updated package names from `com.london.presentation.feature.list.viewitems` to `com.london.presentation.feature.list.details`. - Updated references in `DeleteListBottomSheet.kt` and `mainNavGraph.kt` to reflect the new names. --- .../app/navigation/graph/mainNavGraph.kt | 4 ++-- .../bottomsheets/DeleteListBottomSheet.kt | 4 ++-- .../MovieListDetailsContract.kt} | 4 ++-- .../MovieListDetailsScreen.kt} | 18 +++++++++--------- .../MovieListDetailsViewModel.kt} | 19 +++++++++---------- .../feature/list/details/MovieListEffect.kt | 6 ++++++ .../MovieListUiState.kt} | 4 ++-- .../feature/list/viewitems/ViewItemsEffect.kt | 6 ------ 8 files changed, 32 insertions(+), 33 deletions(-) rename presentation/src/main/java/com/london/presentation/feature/list/{viewitems/ViewItemsContract.kt => details/MovieListDetailsContract.kt} (77%) rename presentation/src/main/java/com/london/presentation/feature/list/{viewitems/ViewItemsScreen.kt => details/MovieListDetailsScreen.kt} (92%) rename presentation/src/main/java/com/london/presentation/feature/list/{viewitems/ViewItemsViewModel.kt => details/MovieListDetailsViewModel.kt} (89%) create mode 100644 presentation/src/main/java/com/london/presentation/feature/list/details/MovieListEffect.kt rename presentation/src/main/java/com/london/presentation/feature/list/{viewitems/ViewItemsUiState.kt => details/MovieListUiState.kt} (87%) delete mode 100644 presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsEffect.kt 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 8e8ac1922..3c1efa79d 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 @@ -47,7 +47,7 @@ import com.london.presentation.feature.home.trending.actor.TrendingActorsScreen import com.london.presentation.feature.home.trending.movie.TrendingMoviesScreen import com.london.presentation.feature.home.trending.tvshow.TrendingTvShowsScreen import com.london.presentation.feature.list.savedlist.ListsScreen -import com.london.presentation.feature.list.viewitems.ViewListItemsScreen +import com.london.presentation.feature.list.details.MovieListDetailsScreen import com.london.presentation.feature.reviews.ReviewsScreen import com.london.presentation.feature.search.SearchScreen import com.london.presentation.navigation.Screen.Account @@ -176,7 +176,7 @@ private fun NavGraphBuilder.onListNavGraph(navController: NavHostController) = ) } appComposable { - ViewListItemsScreen( + MovieListDetailsScreen( onNavigateBack = ::navigateUp, onNavigateToMovieDetails = ::navigateToMovieDetails, ) diff --git a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt index 79ae15c04..ec3f806d0 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/bottomsheets/DeleteListBottomSheet.kt @@ -30,13 +30,13 @@ import com.london.designsystem.theme.NovixTheme import com.london.designsystem.utils.painter import com.london.designsystem.utils.string import com.london.presentation.R -import com.london.presentation.feature.list.viewitems.ViewListItemsContract +import com.london.presentation.feature.list.details.MovieListDetailsContract import kotlinx.coroutines.launch @Composable fun DeleteListBottomSheet( isSheetVisible: Boolean, - contract: ViewListItemsContract, + contract: MovieListDetailsContract, modifier: Modifier = Modifier, sheetState: SheetState = rememberModalBottomSheetState(), ) { diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsContract.kt similarity index 77% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt rename to presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsContract.kt index 6cbbaf74c..a4e807561 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsContract.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsContract.kt @@ -1,6 +1,6 @@ -package com.london.presentation.feature.list.viewitems +package com.london.presentation.feature.list.details -interface ViewListItemsContract { +interface MovieListDetailsContract { fun onBackClick() fun onRetryClick() fun onDeleteClick() diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsScreen.kt similarity index 92% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt rename to presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsScreen.kt index 40ae72d46..8d01eeb35 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsScreen.kt @@ -1,4 +1,4 @@ -package com.london.presentation.feature.list.viewitems +package com.london.presentation.feature.list.details import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -29,18 +29,18 @@ import com.london.presentation.shared.container.MediaLazyVerticalGrid import com.london.presentation.utils.Listen @Composable -fun ViewListItemsScreen( +fun MovieListDetailsScreen( onNavigateBack: () -> Unit, onNavigateToMovieDetails: (Int) -> Unit, - viewModel: ViewItemsViewModel = hiltViewModel() + viewModel: MovieListDetailsViewModel = hiltViewModel() ) { val state by viewModel.state.collectAsStateWithLifecycle() val effect by viewModel.effect.collectAsState(null) effect?.Listen { currentEffect -> when (currentEffect) { - ViewItemsEffect.NavigateBack -> onNavigateBack() - is ViewItemsEffect.NavigationMovieDetails -> + MovieListEffect.NavigateBack -> onNavigateBack() + is MovieListEffect.NavigationMovieDetails -> onNavigateToMovieDetails(currentEffect.id) } } @@ -53,8 +53,8 @@ fun ViewListItemsScreen( @Composable private fun Content( - state: ViewItemsUiState, - contract: ViewListItemsContract, + state: MovieListUiState, + contract: MovieListDetailsContract, ) { val listItems = state.listItems.collectAsLazyPagingItems() @@ -144,8 +144,8 @@ private fun Content( private fun Preview() { NovixTheme { Content( - state = ViewItemsUiState(), - contract = object : ViewListItemsContract { + state = MovieListUiState(), + contract = object : MovieListDetailsContract { override fun onBackClick() {} override fun onRetryClick() {} override fun onDeleteClick() {} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsViewModel.kt similarity index 89% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt rename to presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsViewModel.kt index cde1f0a1c..e523a283e 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsViewModel.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListDetailsViewModel.kt @@ -1,4 +1,4 @@ -package com.london.presentation.feature.list.viewitems +package com.london.presentation.feature.list.details import androidx.lifecycle.SavedStateHandle import androidx.paging.PagingData @@ -15,13 +15,13 @@ import kotlinx.coroutines.flow.Flow import javax.inject.Inject @HiltViewModel -class ViewItemsViewModel @Inject constructor( +class MovieListDetailsViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val manageGetMovieUseCase: ManageGetMovieUseCase, private val manageMovieListUseCase: ManageMovieListUseCase, private val getMovieListNameUseCase: GetMovieListNameUseCase -) : BaseViewModel(ViewItemsUiState()), - ViewListItemsContract { +) : BaseViewModel(MovieListUiState()), + MovieListDetailsContract { private val args = savedStateHandle.getArgs() private val listId = args?.listId ?: 0 @@ -36,7 +36,7 @@ class ViewItemsViewModel @Inject constructor( } override fun onBackClick() { - emitEffect(ViewItemsEffect.NavigateBack) + emitEffect(MovieListEffect.NavigateBack) } override fun onRetryClick() { @@ -44,9 +44,8 @@ class ViewItemsViewModel @Inject constructor( fetchMovieListDetails(listId) } - override fun onDeleteClick() { - updateState { copy(isDeleteBottomSheetVisible = true) } - } + override fun onDeleteClick() = updateState { copy(isDeleteBottomSheetVisible = true) } + override fun onConfirmDelete() { tryToExecute( @@ -55,7 +54,7 @@ class ViewItemsViewModel @Inject constructor( onCompleted = { updateState { copy(isDeleteBottomSheetVisible = false) } }, onError = { updateState { copy(isSnackBarErrorVisible = true, error = it) } }, onSuccess = { - emitEffect(ViewItemsEffect.NavigateBack) + emitEffect(MovieListEffect.NavigateBack) updateState { copy(isListSnackBarSuccess = true) } } ) @@ -63,7 +62,7 @@ class ViewItemsViewModel @Inject constructor( override fun onMovieClick(id: Int) { resetSnackBarsState() - emitEffect(ViewItemsEffect.NavigationMovieDetails(id)) + emitEffect(MovieListEffect.NavigationMovieDetails(id)) } override fun onRemoveMovieClick(id: Int) { diff --git a/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListEffect.kt b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListEffect.kt new file mode 100644 index 000000000..154d4ba39 --- /dev/null +++ b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListEffect.kt @@ -0,0 +1,6 @@ +package com.london.presentation.feature.list.details + +interface MovieListEffect { + object NavigateBack : MovieListEffect + data class NavigationMovieDetails(val id: Int) : MovieListEffect +} diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListUiState.kt similarity index 87% rename from presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt rename to presentation/src/main/java/com/london/presentation/feature/list/details/MovieListUiState.kt index 612379494..b18295255 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsUiState.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/details/MovieListUiState.kt @@ -1,4 +1,4 @@ -package com.london.presentation.feature.list.viewitems +package com.london.presentation.feature.list.details import androidx.paging.PagingData import com.london.domain.entity.movie.Movie @@ -6,7 +6,7 @@ import com.london.presentation.shared.base.ErrorState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -data class ViewItemsUiState( +data class MovieListUiState( val listTitle: String = "", val error: ErrorState? = null, val isLoading: Boolean = false, diff --git a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsEffect.kt b/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsEffect.kt deleted file mode 100644 index 860e5131a..000000000 --- a/presentation/src/main/java/com/london/presentation/feature/list/viewitems/ViewItemsEffect.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.london.presentation.feature.list.viewitems - -interface ViewItemsEffect { - object NavigateBack : ViewItemsEffect - data class NavigationMovieDetails(val id: Int) : ViewItemsEffect -} From debcbade31f689d0ca834f52058b419557bd8d6e Mon Sep 17 00:00:00 2001 From: Yusuf Nasser Date: Thu, 28 Aug 2025 22:01:24 +0300 Subject: [PATCH 10/10] refactor: improve ListsScreen and ListViewModel This commit introduces several improvements to the `ListsScreen` and `ListViewModel`: **ListsScreen.kt:** - Renamed `SavedListItemRow` to `MovieListCard` for better clarity. - Renamed `NoListFoundAsGuest` to `GuestContent`. - Used `items(pagingItems.itemSnapshotList)` for better performance and stability in the `LazyColumn`. - Display snackbar based on `state.isSnackBarErrorVisible` instead of `state.error != null`. - Minor UI adjustment in `GuestContent` by changing image scale. **ListViewModel.kt:** - Simplified `onAddList` by extracting error handling to `handleAddListFail`. - Reset `addListSheetState` to default `AddSheetState()` on successful list creation for a cleaner user experience. - Set `isSnackBarErrorVisible = true` in `handleAddListFail` to ensure error messages are displayed. - Removed redundant `onStart` logic in `onAddList` that was setting `isSnackBarSuccessVisible` to false. - Simplified the `createListsPagingSource` lambda. - Changed `resetSnackBarErrorState` to set `isSnackBarErrorVisible` to `false`. --- .../feature/list/savedlist/ListViewModel.kt | 32 ++++++------- .../feature/list/savedlist/ListsScreen.kt | 45 +++++++------------ 2 files changed, 34 insertions(+), 43 deletions(-) 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 e1a23572a..02377e28c 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 @@ -10,6 +10,7 @@ import com.london.domain.usecase.movielist.ManageMovieListUseCase import com.london.presentation.navigation.Screen import com.london.presentation.navigation.getArgs import com.london.presentation.shared.base.BaseViewModel +import com.london.presentation.shared.base.ErrorState import com.london.presentation.shared.base.createPagingSourceFlow import dagger.hilt.android.lifecycle.HiltViewModel import jakarta.inject.Inject @@ -33,9 +34,7 @@ class ListViewModel @Inject constructor( setAddListSheetVisible(args?.createList ?: false) } - override fun onRetry() = - fetchSavedLists() - + override fun onRetry() = fetchSavedLists() override fun onFabClick() = setAddListSheetVisible(true) @@ -49,28 +48,35 @@ class ListViewModel @Inject constructor( override fun onListNameChanged(listName: TextFieldValue) = updateState { copy(addListSheetState = addListSheetState.copy(listName = listName)) } - override fun resetSnackBarErrorState() = updateState { copy(error = null) } + override fun resetSnackBarErrorState() = updateState { copy(isSnackBarErrorVisible = false) } override fun resetSnackBarSuccessState() = updateState { copy(isSnackBarSuccessVisible = false) } override fun onAddList(listName: String) { tryToExecute( - onStart = { updateState { copy(isSnackBarSuccessVisible = false, isLoading = true) } }, + onStart = { updateState { copy(isLoading = true) } }, block = { manageMovieListUseCase.createMovieList(listName) }, - onError = { updateState { copy(error = it, isLoading = false) } }, + onError = { error -> handleAddListFail(error) }, onSuccess = { handleAddListSuccess() } ) } + private fun handleAddListFail(error: ErrorState) { + updateState { + copy( + error = error, + isLoading = false, + isSnackBarErrorVisible = true + ) + } + } + private fun handleAddListSuccess() { - setAddListSheetVisible(false) updateState { copy( isSnackBarSuccessVisible = true, isLoading = false, - addListSheetState = addListSheetState.copy( - listName = TextFieldValue(""), - ) + addListSheetState = AddSheetState() ) } fetchSavedLists() @@ -87,11 +93,7 @@ class ListViewModel @Inject constructor( } private fun createListsPagingSource(): Flow> = - createPagingSourceFlow { _, pageNumber -> - manageGetMovieUseCase.getAllMovieLists( - pageNumber - ) - } + createPagingSourceFlow { _, pageNumber -> manageGetMovieUseCase.getAllMovieLists(pageNumber) } private fun checkUserLoginStatus(onResult: (Boolean) -> Unit = {}) { tryToExecute( diff --git a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt index 9963a6f3e..772595847 100644 --- a/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt +++ b/presentation/src/main/java/com/london/presentation/feature/list/savedlist/ListsScreen.kt @@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -85,6 +86,7 @@ private fun Content( contract: ListContract, ) { val pagingItems = state.items.collectAsLazyPagingItems() + val snackBarController = LocalSnackbarController.current Box( modifier = Modifier @@ -98,7 +100,7 @@ private fun Content( isError = state.error is ErrorState.NoInternet, pagingFlow = pagingItems, isGuest = state.isGuest, - guestContent = { NoListFoundAsGuest(onLoginClick = contract::onLoginClick) }, + guestContent = { GuestContent(onLoginClick = contract::onLoginClick) }, emptyContent = { EmptyList( contract = contract, @@ -127,14 +129,8 @@ private fun Content( verticalArrangement = Arrangement.spacedBy(8.dp), contentPadding = PaddingValues(vertical = 8.dp) ) { - items(pagingItems.itemCount) { index -> - val item = pagingItems[index] - item?.let { - SavedListItemRow( - itemUi = item, - onCountClick = contract::onListClick - ) - } + items(pagingItems.itemSnapshotList) { item -> + item?.let { MovieListCard(movieList = item, onListClick = contract::onListClick) } } } } @@ -146,9 +142,7 @@ private fun Content( addListSheetState = state.addListSheetState ) - val snackBarController = LocalSnackbarController.current - - if (state.error != null) { + if (state.isSnackBarErrorVisible) { snackBarController.showMessage( message = R.string.list_add_fail.string, snackBarType = SnackBarType.Error, @@ -185,15 +179,15 @@ fun BoxScope.ListFAB( } @Composable -private fun SavedListItemRow( - itemUi: MovieList, - onCountClick: (Int) -> Unit +private fun MovieListCard( + movieList: MovieList, + onListClick: (Int) -> Unit ) { Row( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(12.dp)) - .clickable { onCountClick(itemUi.id) } + .clickable { onListClick(movieList.id) } .background(NovixTheme.colors.surface) .border( width = 1.dp, @@ -204,23 +198,18 @@ private fun SavedListItemRow( .zIndex(2f) ) { Text( - text = itemUi.name, + text = movieList.name, style = NovixTheme.typography.title.medium, color = NovixTheme.colors.title, maxLines = 1, - modifier = Modifier - .weight(1f) - ) - ItemCount( - itemUi = itemUi, + modifier = Modifier.weight(1f) ) + ItemCount(count = movieList.moviesCount) } } @Composable -private fun ItemCount( - itemUi: MovieList, -) { +private fun ItemCount(count: Int) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), @@ -230,7 +219,7 @@ private fun ItemCount( .padding(horizontal = 8.dp, vertical = 4.dp) ) { Text( - text = itemUi.moviesCount.toLocalizedNumbers(), + text = count.toLocalizedNumbers(), style = NovixTheme.typography.label.small, color = NovixTheme.colors.primary, ) @@ -274,7 +263,7 @@ private fun EmptyList( } @Composable -private fun NoListFoundAsGuest( +private fun GuestContent( onLoginClick: () -> Unit, modifier: Modifier = Modifier ) { @@ -330,7 +319,7 @@ private fun BlurredImage(@DrawableRes imageId: Int) { } else { Image( modifier = Modifier - .scale(2.1f) + .scale(2f) .size(23.dp) .align(Alignment.BottomCenter), painter = R.drawable.ellipse_pre_blurred.painter,