Skip to content

Commit 5ad8204

Browse files
Merge pull request #792 from Rome-Squad/refactor/789-genre-mapping-in-homeviewmodel
Refactor: Observe movie genres and improve data loading
2 parents 05fe4c5 + c9b1c53 commit 5ad8204

File tree

5 files changed

+52
-37
lines changed

5 files changed

+52
-37
lines changed

datasource/local/media/src/main/java/com/giraffe/media/movie/MovieLocalDataSourceImpl.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import com.giraffe.media.movie.mapper.toRecentlyViewedMovieCacheDto
1111
import com.giraffe.media.movie.mapper.toUpcomingMovieCacheDto
1212
import com.giraffe.media.util.safeCall
1313
import com.giraffe.media.util.safeFlow
14+
import kotlinx.coroutines.FlowPreview
15+
import kotlinx.coroutines.flow.debounce
1416
import javax.inject.Inject
1517

1618

@@ -37,8 +39,9 @@ class MovieLocalDataSourceImpl @Inject constructor(
3739
override fun getMovieGenresByIds(ids: List<Int>) =
3840
safeFlow { movieDao.getMovieGenresByIds(ids) }
3941

42+
@OptIn(FlowPreview::class)
4043
override fun getMoviesGenres() =
41-
safeFlow { movieDao.getMoviesGenres() }
44+
safeFlow { movieDao.getMoviesGenres() }.debounce(1000L)
4245

4346
override suspend fun getTopGenre() =
4447
safeCall { movieDao.getTopGenre() }

presentation/home/src/main/java/com/giraffe/presentation/home/screen/home/HomeScreenState.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.giraffe.presentation.home.screen.home
22

3+
import com.giraffe.media.entity.Genre
34
import com.giraffe.presentation.home.model.FeaturedCollectionType
45
import com.giraffe.presentation.home.model.FeaturedCollectionUi
56
import com.giraffe.presentation.home.model.PopularMediaUi
@@ -28,4 +29,6 @@ data class HomeScreenState(
2829
val isLoadingTopRatedSeries: Boolean = true,
2930
val isNoInternet: Boolean = false,
3031
val isLoggedIn: Boolean = false,
32+
val moviesGenres: List<Genre> = emptyList(),
33+
val seriesGenres: List<Genre> = emptyList()
3134
)

presentation/home/src/main/java/com/giraffe/presentation/home/screen/home/HomeViewModel.kt

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ package com.giraffe.presentation.home.screen.home
33
import androidx.lifecycle.viewModelScope
44
import com.giraffe.media.collections.entity.Collection
55
import com.giraffe.media.collections.usecase.GetCollectionsUseCase
6+
import com.giraffe.media.entity.Genre
67
import com.giraffe.media.exception.NoInternetException
78
import com.giraffe.media.movie.entity.Movie
89
import com.giraffe.media.movie.usecase.ObservePopularMoviesUseCase
9-
import com.giraffe.media.movie.usecase.genre.GetMoviesGenresByIdsUseCase
10+
import com.giraffe.media.movie.usecase.genre.ObserveMoviesGenresUseCase
1011
import com.giraffe.media.movie.usecase.matchesYourVibe.ObserveMatchesYourVibeMoviesUseCase
1112
import com.giraffe.media.movie.usecase.recentlyReleased.ObserveRecentlyReleasedMoviesUseCase
1213
import com.giraffe.media.movie.usecase.recentlyViewed.ObserveRecentlyViewedMoviesUseCase
@@ -41,18 +42,19 @@ class HomeViewModel @Inject constructor(
4142
private val observeTopRatedSeriesUseCase: ObserveTopRatedSeriesUseCase,
4243
private val observeUpcomingMoviesUseCase: ObserveUpcomingMoviesUseCase,
4344
private val getSeriesGenresByIdsUseCase: GetSeriesGenresByIdsUseCase,
44-
private val getMoviesGenresByIdsUseCase: GetMoviesGenresByIdsUseCase,
4545
private val observeRecentlyViewedMoviesUseCase: ObserveRecentlyViewedMoviesUseCase,
4646
private val observeRecentlyViewedSeriesUseCase: ObserveRecentlyViewedSeriesUseCase,
4747
private val observeMatchesYourVibeMoviesUseCase: ObserveMatchesYourVibeMoviesUseCase,
4848
private val observeMatchesYourVibeSeriesUseCase: ObserveMatchesYourVibeSeriesUseCase,
4949
private val getCollectionsUseCase: GetCollectionsUseCase,
5050
private val getUserNameUseCase: GetUserNameUseCase,
51-
private val isLoggedInByAccountUseCase: IsLoggedInByAccountUseCase
51+
private val isLoggedInByAccountUseCase: IsLoggedInByAccountUseCase,
52+
private val observeMoviesGenresUseCase: ObserveMoviesGenresUseCase
5253
) : BaseViewModel<HomeScreenState, HomeEffect>(initialState = HomeScreenState()),
5354
HomeInteractionListener {
5455

5556
init {
57+
5658
loadHomeScreenData()
5759
}
5860

@@ -69,14 +71,30 @@ class HomeViewModel @Inject constructor(
6971
)
7072
}
7173
isLoggedIn()
72-
getPopularity()
74+
getUserName()
75+
getYourCollections()
76+
77+
getMoviesGenres()
78+
7379
getRecentlyReleased()
7480
getUpcomingMovies()
7581
getMatchesYourVibe()
7682
getTopRatedSeries()
7783
getRecentViewed()
78-
getUserName()
79-
getYourCollections()
84+
85+
}
86+
87+
private fun getMoviesGenres() {
88+
safeCollect(
89+
onEmitNewValue = ::onGetMoviesGenresSuccess,
90+
onError = ::onError.also { getPopularity() },
91+
block = observeMoviesGenresUseCase::invoke
92+
)
93+
}
94+
95+
private fun onGetMoviesGenresSuccess(genres: List<Genre>) {
96+
updateState { it.copy(moviesGenres = genres) }
97+
getPopularity()
8098
}
8199

82100
private fun isLoggedIn() {
@@ -121,32 +139,25 @@ class HomeViewModel @Inject constructor(
121139

122140

123141
private fun getPopularity() {
124-
viewModelScope.launch(Dispatchers.IO) {
125-
safeCollect(
126-
onEmitNewValue = ::onGetPopularityMoviesSuccess,
127-
onError = ::onError,
128-
block = observePopularMoviesUseCase::invoke
129-
)
130-
safeCollect(
131-
onEmitNewValue = ::onGetPopularitySeriesSuccess,
132-
onError = ::onError,
133-
block = observePopularSeriesUseCase::invoke
134-
)
135-
}
142+
safeCollect(
143+
onEmitNewValue = ::onGetPopularityMoviesSuccess,
144+
onError = ::onError,
145+
block = observePopularMoviesUseCase::invoke
146+
)
147+
safeCollect(
148+
onEmitNewValue = ::onGetPopularitySeriesSuccess,
149+
onError = ::onError,
150+
block = observePopularSeriesUseCase::invoke
151+
)
136152
}
137153

138154
private fun onGetPopularityMoviesSuccess(movies: List<Movie>) {
139-
safeExecute {
140-
val popularMoviesUi = movies.map { movie ->
141-
val genres = getMoviesGenresByIdsUseCase(movie.genresID).map { it.title }
142-
movie.toPopularMediaUi(genres)
143-
}
144-
updateState { currentState ->
145-
currentState.copy(
146-
popularity = (popularMoviesUi + currentState.popularity).distinctBy { it.id },
147-
isLoadingPopularity = false
148-
)
149-
}
155+
updateState {
156+
val newMovies = movies.map { movie -> movie.toPopularMediaUi(it.moviesGenres) }
157+
it.copy(
158+
popularity = (newMovies + it.popularity).distinctBy { movie -> movie.id },
159+
isLoadingPopularity = false
160+
)
150161
}
151162
}
152163

presentation/home/src/main/java/com/giraffe/presentation/home/utils/Mapper.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.giraffe.presentation.home.utils
22

33
import com.giraffe.media.collections.entity.Collection
4+
import com.giraffe.media.entity.Genre
45
import com.giraffe.media.movie.entity.Movie
56
import com.giraffe.media.series.entity.Series
67
import com.giraffe.presentation.home.model.MediaType
@@ -55,12 +56,14 @@ fun Movie.toShowMorePoster(genres: List<String>) = PosterMedia(
5556
)
5657

5758

58-
fun Movie.toPopularMediaUi(genres: List<String>) = PopularMediaUi(
59+
fun Movie.toPopularMediaUi(genres: List<Genre>) = PopularMediaUi(
5960
id = id,
6061
title = name,
6162
posterUrl = posterUrl,
6263
backdropUrl = backdropUrl,
63-
genres = genres,
64+
genres = genres
65+
.filter { genre -> genre.id in genresID }
66+
.map { genre -> genre.title },
6467
rating = rating,
6568
mediaType = MediaType.MOVIE
6669
)

repository/media/src/main/java/com/giraffe/media/movie/MovieRepositoryImpl.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,6 @@ class MovieRepositoryImpl @Inject constructor(
9999
return safeFlow {
100100
movieLocal.getMoviesGenres()
101101
.map { it.map(MovieGenreCacheDto::toEntity) }
102-
.onEach {
103-
it.ifEmpty {
104-
getGenres()
105-
}
106-
}
107102
}
108103
}
109104

0 commit comments

Comments
 (0)