diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailGenre.kt b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailGenre.kt new file mode 100644 index 0000000..a093324 --- /dev/null +++ b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailGenre.kt @@ -0,0 +1,48 @@ +package com.salt.apps.moov.ui.components.detail + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.material3.Card +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.utilities.DataMapper + +@Composable +fun DetailGenre(data: Movie, modifier: Modifier = Modifier) { + val genres = DataMapper.mapGenreIdToGenre(data.genreIds) + Box( + modifier = modifier + .fillMaxWidth() + ) { + LazyRow( + modifier = modifier + .align(Alignment.Center) + ) { + items(genres.take(3).size) { index -> + Card( + modifier = Modifier.padding(end = 10.dp), + ) { + Text( + text = genres[index] ?: "N/A", + color = MaterialTheme.colorScheme.onPrimary, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .background(MaterialTheme.colorScheme.primary) + .padding( + horizontal = 15.dp, + vertical = 5.dp + ), + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailImage.kt b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailImage.kt new file mode 100644 index 0000000..325abe0 --- /dev/null +++ b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailImage.kt @@ -0,0 +1,91 @@ +package com.salt.apps.moov.ui.components.detail + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Card +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.ui.components.ImageNetworkLoader +import com.salt.apps.moov.ui.screens.detail.DetailViewModel + +@Composable +fun DetailImage(data: Movie, detailViewModel: DetailViewModel) { + var isFavorite by remember { mutableStateOf(false) } + Box( + modifier = Modifier + .height(340.dp) + ) { + Box { + ImageNetworkLoader( + imageUrl = data.backdropPath ?: "", + voteAverage = 0f, + showVoteAverage = false, + modifier = Modifier + .fillMaxWidth() + .height(250.dp) + ) + + Spacer( + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter) + .height(100.dp) + .background( + brush = Brush.verticalGradient( + colors = listOf( + Color.Transparent, + Color.White + ), + ), + ) + ) + + } + Box( + modifier = Modifier.align(Alignment.BottomCenter) + ) { + Card { + ImageNetworkLoader( + imageUrl = data.posterPath ?: "", + voteAverage = data.voteAverage?.toFloat() ?: 0f, + modifier = Modifier + .width(150.dp) + .height(200.dp) + ) + } + + Card( + modifier = Modifier + .align(Alignment.BottomEnd) + ) { + ToggleFavorite( + isFavorite = data.isFavorite, + onToggle = { + isFavorite = it + detailViewModel.toggleFavorite(data.id, isFavorite) + }, modifier = Modifier + .size(45.dp) + .background( + color = MaterialTheme.colorScheme.background, + ) + ) + } + } + } + +} diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailMovieRow.kt b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailMovieRow.kt new file mode 100644 index 0000000..2a01397 --- /dev/null +++ b/app/src/main/java/com/salt/apps/moov/ui/components/detail/DetailMovieRow.kt @@ -0,0 +1,36 @@ +package com.salt.apps.moov.ui.components.detail + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.salt.apps.moov.data.model.Movie + +@Composable +fun DetailMovieRow(data: Movie) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly + ) { + DetailColumn("Release date", data.releaseDate ?: "N/A") + DetailColumn("Language", data.originalLanguage) + DetailColumn("Votes", data.voteCount.toString()) + } +} + +@Composable +fun DetailColumn(title: String, value: String) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text(title, style = MaterialTheme.typography.bodyMedium) + Text(value, style = MaterialTheme.typography.bodyMedium) + } +} diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/detail/ToggleFavorite.kt b/app/src/main/java/com/salt/apps/moov/ui/components/detail/ToggleFavorite.kt new file mode 100644 index 0000000..81e1db4 --- /dev/null +++ b/app/src/main/java/com/salt/apps/moov/ui/components/detail/ToggleFavorite.kt @@ -0,0 +1,41 @@ +package com.salt.apps.moov.ui.components.detail + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.FavoriteBorder +import androidx.compose.material3.Icon +import androidx.compose.material3.IconToggleButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color + +@Composable +fun ToggleFavorite( + modifier: Modifier = Modifier, + onToggle: (Boolean) -> Unit, + isFavorite: Boolean = false +) { + var isChecked by remember { mutableStateOf(isFavorite) } + + IconToggleButton( + modifier = modifier, + checked = isChecked, + onCheckedChange = { + isChecked = it + onToggle(it) + } + ) { + val icon = if (isChecked) Icons.Filled.Favorite else Icons.Filled.FavoriteBorder + val iconTint = if (isChecked) Color.Red else Color.Red + + Icon( + imageVector = icon, + contentDescription = null, + tint = iconTint, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/main/MoovApp.kt b/app/src/main/java/com/salt/apps/moov/ui/components/main/MoovApp.kt index 82598b2..9d16d26 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/components/main/MoovApp.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/components/main/MoovApp.kt @@ -1,25 +1,15 @@ package com.salt.apps.moov.ui.components.main -import androidx.compose.animation.AnimatedContentTransitionScope -import androidx.compose.animation.core.tween -import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier import androidx.navigation.NavHostController -import androidx.navigation.NavType -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import androidx.navigation.navArgument +import com.salt.apps.moov.ui.navigation.MoovNavHost import com.salt.apps.moov.ui.navigation.MoovScreen.DETAIL import com.salt.apps.moov.ui.navigation.MoovScreen.FAVORITE import com.salt.apps.moov.ui.navigation.MoovScreen.HOME -import com.salt.apps.moov.ui.screens.detail.DetailScreen -import com.salt.apps.moov.ui.screens.favorite.FavoriteScreen -import com.salt.apps.moov.ui.screens.home.HomeScreen @Composable fun MoovApp( @@ -28,14 +18,8 @@ fun MoovApp( val backStackEntry by navController.currentBackStackEntryAsState() val currentScreen = backStackEntry?.destination?.route?.let { route -> when (route) { - HOME.route -> { - HOME - } - - "${DETAIL.route}/{movieId}" -> { - DETAIL - } - + HOME.route -> HOME + "${DETAIL.route}/{movieId}" -> DETAIL FAVORITE.route -> FAVORITE else -> null } @@ -55,71 +39,7 @@ fun MoovApp( ) }, content = { innerPadding -> - NavHost( - navController = navController, - startDestination = HOME.route, - modifier = Modifier.padding(innerPadding), - ) { - composable( - route = HOME.route, - enterTransition = { - return@composable slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.Up, tween(500) - ) - }, - exitTransition = { - return@composable slideOutOfContainer( - AnimatedContentTransitionScope.SlideDirection.Start, tween(500) - ) - }, - popEnterTransition = { - return@composable slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.End, tween(500) - ) - }, - content = { - HomeScreen( - navController = navController, - ) - } - ) - composable( - route = "${DETAIL.route}/{movieId}", - arguments = listOf( - navArgument(name = "movieId") { - type = NavType.IntType - } - ), - content = { - val movieId = backStackEntry?.arguments?.getInt("movieId") - DetailScreen(movieId = movieId) - } - ) - - composable( - route = FAVORITE.route, - enterTransition = { - return@composable slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.Start, tween(500) - ) - }, - exitTransition = { - return@composable slideOutOfContainer( - AnimatedContentTransitionScope.SlideDirection.End, tween(500) - ) - }, - popEnterTransition = { - return@composable slideIntoContainer( - AnimatedContentTransitionScope.SlideDirection.Start, tween(500) - ) - }, - content = { - FavoriteScreen( - navController = navController, - ) - } - ) - } + MoovNavHost(navController = navController, innerPadding = innerPadding) } ) -} +} \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/components/upcoming/CarouselMovieItem.kt b/app/src/main/java/com/salt/apps/moov/ui/components/upcoming/CarouselMovieItem.kt index 1828155..be7f172 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/components/upcoming/CarouselMovieItem.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/components/upcoming/CarouselMovieItem.kt @@ -1,21 +1,34 @@ package com.salt.apps.moov.ui.components.upcoming +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Card import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import com.salt.apps.moov.data.model.Moov +import com.salt.apps.moov.data.model.Movie import com.salt.apps.moov.ui.components.ImageNetworkLoader import com.salt.apps.moov.ui.navigation.MoovScreen @OptIn(ExperimentalMaterial3Api::class) @Composable fun CarouselMovieItem( - moov: Moov, + movie: Movie, sizeScale: Float, navController: NavController ) { @@ -27,12 +40,45 @@ fun CarouselMovieItem( scaleY = sizeScale ), onClick = { - navController.navigate("${MoovScreen.DETAIL.route}/${moov.id}") + navController.navigate("${MoovScreen.DETAIL.route}/${movie.id}") } ) { - ImageNetworkLoader( - imageUrl = moov.backdropPath ?: "", - voteAverage = moov.voteAverage?.toFloat() ?: 0f, - ) + Box( + modifier = Modifier + .fillMaxWidth() + .height(160.dp) + ) { + ImageNetworkLoader( + imageUrl = movie.backdropPath ?: "", + voteAverage = movie.voteAverage?.toFloat() ?: 0f, + modifier = Modifier.height(160.dp), + ) + Spacer( + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter) + .height(50.dp) + .background( + brush = Brush.verticalGradient( + colors = listOf( + Color.Transparent, + MaterialTheme.colorScheme.scrim.copy(alpha = .6f) + ), + ), + ) + ) + Text( + movie.title, + style = MaterialTheme.typography.titleLarge.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimary + ), + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter) + .padding(10.dp) + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailScreen.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailScreen.kt index c34545d..f12c86e 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailScreen.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailScreen.kt @@ -1,9 +1,111 @@ package com.salt.apps.moov.ui.screens.detail +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.salt.apps.moov.data.Resource +import com.salt.apps.moov.ui.components.CircularLoading +import com.salt.apps.moov.ui.components.detail.DetailGenre +import com.salt.apps.moov.ui.components.detail.DetailImage +import com.salt.apps.moov.ui.components.detail.DetailMovieRow @Composable fun DetailScreen( - movieId: Int? + movieId: Int?, + detailViewModel: DetailViewModel = hiltViewModel() ) { + val detailMovieState by detailViewModel.detailMovie.collectAsState() + + LaunchedEffect(Unit) { + detailViewModel.getFavoriteMovies(movieId ?: 0) + } + + when (detailMovieState) { + is Resource.Loading -> { + CircularLoading() + } + + is Resource.Success -> { + val data = (detailMovieState as Resource.Success).data + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + ) { + item { + DetailImage(data = data, detailViewModel = detailViewModel) + + Text( + data.title, + style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.Bold), + modifier = Modifier + .fillMaxWidth() + .padding(20.dp), + textAlign = TextAlign.Center + ) + + DetailGenre(data = data) + + Text( + text = data.overview ?: "", + color = Color.Black, + lineHeight = 25.sp, + modifier = Modifier.padding(20.dp), + style = MaterialTheme.typography.bodyMedium, + textAlign = TextAlign.Justify + ) + + DetailMovieRow(data) + } + } + +// Column( +// modifier = Modifier +// .fillMaxSize() +// .background(MaterialTheme.colorScheme.background) +// ) { +// DetailImage(data = data, detailViewModel = detailViewModel) +// +// Text( +// data.title, +// style = MaterialTheme.typography.titleLarge.copy(fontWeight = FontWeight.Bold), +// modifier = Modifier +// .fillMaxWidth() +// .padding(20.dp), +// textAlign = TextAlign.Center +// ) +// +// DetailGenre(data = data) +// +// Text( +// text = data.overview ?: "", +// color = Color.Black, +// lineHeight = 25.sp, +// modifier = Modifier.padding(20.dp), +// style = MaterialTheme.typography.bodyMedium, +// textAlign = TextAlign.Justify +// ) +// +// DetailMovieRow(data) +// } + } + + is Resource.Error -> {} + } } \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailViewModel.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailViewModel.kt index c22b263..030680f 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailViewModel.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/detail/DetailViewModel.kt @@ -3,8 +3,8 @@ package com.salt.apps.moov.ui.screens.detail import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.salt.apps.moov.data.Resource -import com.salt.apps.moov.data.model.Moov -import com.salt.apps.moov.data.repository.MoovRepository +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.data.repository.MovieRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -12,23 +12,19 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class DetailViewModel @Inject constructor(private val moovRepository: MoovRepository) : +class DetailViewModel @Inject constructor(private val movieRepository: MovieRepository) : ViewModel() { - private val _moovDetail = MutableStateFlow>(Resource.Loading()) - val moovDetail: StateFlow> get() = _moovDetail + private val _detailMovie = MutableStateFlow>(Resource.Loading()) + val detailMovie: StateFlow> get() = _detailMovie - fun fetchFavoriteMovies(moovId: Int) { - viewModelScope.launch { - moovRepository.getMoovById(moovId).collect { - _moovDetail.value = it - } + fun getFavoriteMovies(movieId: Int) = viewModelScope.launch { + movieRepository.getMovieById(movieId).collect { + _detailMovie.value = it } } - fun toggleFavorite(movieId: Int, isFavorite: Boolean) { - viewModelScope.launch { - moovRepository.updateFavoriteMovie(movieId, isFavorite) - } + fun toggleFavorite(movieId: Int, isFavorite: Boolean) = viewModelScope.launch { + movieRepository.updateMovieById(movieId, isFavorite) } } \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteScreen.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteScreen.kt index 038029a..bf65865 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteScreen.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteScreen.kt @@ -1,7 +1,66 @@ package com.salt.apps.moov.ui.screens.favorite +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.navigation.NavController +import com.salt.apps.moov.data.Resource +import com.salt.apps.moov.ui.components.CircularLoading +import com.salt.apps.moov.ui.components.MovieListItem @Composable -fun FavoriteScreen() { +fun FavoriteScreen( + navController: NavController, + favoriteViewModel: FavoriteViewModel = hiltViewModel() +) { + val favoriteMoviesState by favoriteViewModel.favoriteMovies.collectAsState() + + LaunchedEffect(Unit) { + favoriteViewModel.getFavoriteMovies() + } + + when (favoriteMoviesState) { + is Resource.Loading -> { + CircularLoading() + } + + is Resource.Success -> { + val data = (favoriteMoviesState as Resource.Success).data + if (data.isEmpty()) { + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background), + contentAlignment = Alignment.Center + ) { + Text( + "No favorite movies available", + style = MaterialTheme.typography.titleLarge + ) + } + } else { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + ) { + items(data.size) { index -> + MovieListItem(movie = data[index], navController = navController) + } + } + } + } + + is Resource.Error -> {} + } } \ No newline at end of file diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteViewModel.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteViewModel.kt index 91c4d4c..9e50ce4 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteViewModel.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/favorite/FavoriteViewModel.kt @@ -1,10 +1,24 @@ package com.salt.apps.moov.ui.screens.favorite import androidx.lifecycle.ViewModel -import com.salt.apps.moov.data.repository.MoovRepository +import androidx.lifecycle.viewModelScope +import com.salt.apps.moov.data.Resource +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.data.repository.MovieRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class FavoriteViewModel @Inject constructor(private val moovRepository: MoovRepository) : - ViewModel() \ No newline at end of file +class FavoriteViewModel @Inject constructor(private val movieRepository: MovieRepository) : + ViewModel() { + private val _favoriteMovies = MutableStateFlow>>(Resource.Loading()) + val favoriteMovies: StateFlow>> get() = _favoriteMovies + fun getFavoriteMovies() = viewModelScope.launch { + movieRepository.getFavoriteMovies().collect { + _favoriteMovies.value = it + } + } +} diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeScreen.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeScreen.kt index 9e26df7..a4451bc 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeScreen.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeScreen.kt @@ -25,8 +25,8 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavController import com.salt.apps.moov.data.Resource -import com.salt.apps.moov.data.model.Moov -import com.salt.apps.moov.ui.components.popular.PopularListItem +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.ui.components.MovieListItem import com.salt.apps.moov.ui.components.upcoming.AnimationScrollItem import com.salt.apps.moov.ui.components.upcoming.CarouselMovieItem @@ -73,7 +73,7 @@ fun HomeScreen( @OptIn(ExperimentalFoundationApi::class) @Composable fun HandleSectionMoviesState( - upcomingMoviesState: Resource>, + upcomingMoviesState: Resource>, navController: NavController ) { val pageCount = Int.MAX_VALUE @@ -103,7 +103,7 @@ fun HandleSectionMoviesState( ) CarouselMovieItem( - moov = movies[page % movies.size], + movie = movies[page % movies.size], sizeScale = sizeScale, navController = navController ) @@ -118,7 +118,7 @@ fun HandleSectionMoviesState( } fun LazyListScope.handlePopularMoviesState( - popularMoviesState: Resource>, + popularMoviesState: Resource>, navController: NavController ) { when (popularMoviesState) { @@ -128,7 +128,7 @@ fun LazyListScope.handlePopularMoviesState( val movies = popularMoviesState.data items(movies.size) { index -> - PopularListItem(movie = movies[index], navController = navController) + MovieListItem(movie = movies[index], navController = navController) } } diff --git a/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeViewModel.kt b/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeViewModel.kt index 225572f..eaeb38c 100644 --- a/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeViewModel.kt +++ b/app/src/main/java/com/salt/apps/moov/ui/screens/home/HomeViewModel.kt @@ -3,42 +3,38 @@ package com.salt.apps.moov.ui.screens.home import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.salt.apps.moov.data.Resource -import com.salt.apps.moov.data.model.Moov -import com.salt.apps.moov.data.repository.MoovRepository +import com.salt.apps.moov.data.model.Movie +import com.salt.apps.moov.data.repository.MovieRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -class HomeViewModel @Inject constructor(private val moovRepository: MoovRepository) : ViewModel() { +class HomeViewModel @Inject constructor(private val movieRepository: MovieRepository) : + ViewModel() { - private val _popularMoviesState = MutableStateFlow>>(Resource.Loading()) - val popularMoviesState: StateFlow>> = _popularMoviesState + private val _popularMoviesState = MutableStateFlow>>(Resource.Loading()) + val popularMoviesState: StateFlow>> get() = _popularMoviesState - private val _upcomingMoviesState = MutableStateFlow>>(Resource.Loading()) - val upcomingMoviesState: StateFlow>> = _upcomingMoviesState + private val _upcomingMoviesState = MutableStateFlow>>(Resource.Loading()) + val upcomingMoviesState: StateFlow>> get() = _upcomingMoviesState init { fetchPopularMovies() fetchUpcomingMovies() } - private fun fetchPopularMovies() { - viewModelScope.launch { - moovRepository.getPopularMoovs().collectLatest { result -> - _popularMoviesState.value = result - } + private fun fetchPopularMovies() = viewModelScope.launch { + movieRepository.getPopularMovies().collect { result -> + _popularMoviesState.value = result } } - private fun fetchUpcomingMovies() { - viewModelScope.launch { - moovRepository.getUpcomingMoovs().collectLatest { result -> - _upcomingMoviesState.value = result - } + private fun fetchUpcomingMovies() = viewModelScope.launch { + movieRepository.getUpcomingMovies().collect { result -> + _upcomingMoviesState.value = result } } } \ No newline at end of file