Skip to content

Commit

Permalink
Added paginated Movies by search query and trending this week
Browse files Browse the repository at this point in the history
  • Loading branch information
umidjonkhasimov committed Mar 29, 2024
1 parent a5ea704 commit 0a62e9a
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package uz.john.data.pagination.movies

import androidx.paging.PagingSource
import androidx.paging.PagingState
import uz.john.data.remote.model.movie.MovieData
import uz.john.data.repository.MoviesRepository
import uz.john.util.ResultModel

class MoviesBySearchQueryPagingSource(
private val moviesRepository: MoviesRepository,
private val query: String
) : PagingSource<Int, MovieData>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, MovieData> {
val page = params.key ?: 1

val response = moviesRepository.searchMovies(
query = query,
page = page
)

return when (response) {
is ResultModel.Error -> {
LoadResult.Error(response.error)
}

is ResultModel.Exception -> {
LoadResult.Error(response.throwable)
}

is ResultModel.Success -> {
LoadResult.Page(
data = response.data.results,
prevKey = if (page == 1) null else page.minus(1),
nextKey = if (response.data.results.isEmpty()) null else page.plus(1),
)
}
}
}

override fun getRefreshKey(state: PagingState<Int, MovieData>): Int? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package uz.john.data.pagination.movies

import androidx.paging.PagingSource
import androidx.paging.PagingState
import uz.john.data.remote.model.movie.MovieData
import uz.john.data.repository.MoviesRepository
import uz.john.util.ResultModel

class MoviesTrendingThisWeekPagingSource(
private val moviesRepository: MoviesRepository
) : PagingSource<Int, MovieData>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, MovieData> {
val page = params.key ?: 1

val response = moviesRepository.getTrendingThisWeekMovies(
page = page
)

return when (response) {
is ResultModel.Error -> {
LoadResult.Error(response.error)
}

is ResultModel.Exception -> {
LoadResult.Error(response.throwable)
}

is ResultModel.Success -> {
LoadResult.Page(
data = response.data.results,
prevKey = if (page == 1) null else page.minus(1),
nextKey = if (response.data.results.isEmpty()) null else page.plus(1),
)
}
}
}

override fun getRefreshKey(state: PagingState<Int, MovieData>): Int? {
return state.anchorPosition?.let { anchorPosition ->
state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,5 @@ class GetPaginatedMoviesByGenreUseCase @Inject constructor(
pagingData.map {
it.toDomain()
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package uz.john.domain.use_cases.movies.pagination

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.map
import kotlinx.coroutines.flow.map
import uz.john.data.pagination.movies.MoviesBySearchQueryPagingSource
import uz.john.data.repository.MoviesRepository
import uz.john.domain.model.movie.toDomain
import javax.inject.Inject

class GetPaginatedMoviesBySearchQueryUseCase @Inject constructor(
private val moviesRepository: MoviesRepository
) {
operator fun invoke(query: String) = Pager(
config = PagingConfig(
pageSize = 20
),
pagingSourceFactory = {
MoviesBySearchQueryPagingSource(
moviesRepository = moviesRepository,
query = query
)
}
).flow.map { pagingData ->
pagingData.map {
it.toDomain()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package uz.john.domain.use_cases.movies.pagination

import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.map
import kotlinx.coroutines.flow.map
import uz.john.data.pagination.movies.MoviesTrendingThisWeekPagingSource
import uz.john.data.repository.MoviesRepository
import uz.john.domain.model.movie.toDomain
import javax.inject.Inject

class GetPaginatedMoviesTrendingThisWeekUseCase @Inject constructor(
private val moviesRepository: MoviesRepository
) {
operator fun invoke() = Pager(
config = PagingConfig(
pageSize = 20
),
pagingSourceFactory = {
MoviesTrendingThisWeekPagingSource(
moviesRepository = moviesRepository
)
}
).flow.map { pagingData ->
pagingData.map {
it.toDomain()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import kotlinx.coroutines.flow.flowOf
import kotlinx.serialization.json.Json
import uz.john.domain.model.movie.Movie
import uz.john.domain.use_cases.movies.pagination.GetPaginatedMoviesByGenreUseCase
import uz.john.domain.use_cases.movies.pagination.GetPaginatedMoviesBySearchQueryUseCase
import uz.john.domain.use_cases.movies.pagination.GetPaginatedMoviesTrendingThisWeekUseCase
import uz.john.domain.use_cases.movies.pagination.GetPaginatedNowPlayingMoviesUseCase
import uz.john.domain.use_cases.movies.pagination.GetPaginatedPopularMoviesUseCase
import uz.john.domain.use_cases.movies.pagination.GetPaginatedRecommendedMoviesUseCase
Expand All @@ -33,6 +35,8 @@ class AllMoviesViewModel @Inject constructor(
getPaginatedSimilarMoviesUseCase: GetPaginatedSimilarMoviesUseCase,
getPaginatedRecommendedMoviesUseCase: GetPaginatedRecommendedMoviesUseCase,
getPaginatedMoviesByGenreUseCase: GetPaginatedMoviesByGenreUseCase,
getPaginatedMoviesBySearchQueryUseCase: GetPaginatedMoviesBySearchQueryUseCase,
getPaginatedMoviesTrendingThisWeekUseCase: GetPaginatedMoviesTrendingThisWeekUseCase,
@ApplicationContext context: Context,
savedStateHandle: SavedStateHandle
) : ViewModel(), MVI<UiState, UiAction, SideEffect> by mvi(UiState()) {
Expand Down Expand Up @@ -77,11 +81,11 @@ class AllMoviesViewModel @Inject constructor(
}

is AllMoviesScreenParam.AllMoviesBySearchQuery -> {
flowOf()
getPaginatedMoviesBySearchQueryUseCase(allMoviesScreenParam.query).cachedIn(viewModelScope)
}

AllMoviesScreenParam.MoviesTrendingThisWeek -> {
flowOf()
getPaginatedMoviesTrendingThisWeekUseCase().cachedIn(viewModelScope)
}

null -> {
Expand Down

0 comments on commit 0a62e9a

Please sign in to comment.