Skip to content

Commit

Permalink
Merge pull request #26 from gabrielbmoro/feature/21-side-effects-afte…
Browse files Browse the repository at this point in the history
…r-adding-paging-supp

21 Side effects after adding paging support
  • Loading branch information
gabrielbmoro committed Jul 4, 2023
2 parents 5c1d153 + 90eccfd commit adae480
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ package com.gabrielbmoro.programmingchallenge.ui.common.widgets

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.paging.LoadState
import androidx.paging.PagingData
import androidx.paging.compose.collectAsLazyPagingItems
import androidx.paging.compose.itemContentType
Expand All @@ -34,63 +37,98 @@ private fun MovieListInternal(
}

@Composable
fun MoviesListPaginated(
fun BoxScope.MoviesListPaginated(
lazyListState: LazyListState,
pagingDataFlow: Flow<PagingData<Movie>>,
onSelectMovie: ((Movie) -> Unit),
modifier: Modifier = Modifier
) {
val lazyPagingItems = pagingDataFlow.collectAsLazyPagingItems()

MovieListInternal(
lazyListState = lazyListState,
modifier = modifier,
itemFactory = {
items(
count = lazyPagingItems.itemCount,
key = lazyPagingItems.itemKey(),
contentType = lazyPagingItems.itemContentType()
) { index ->

lazyPagingItems[index]?.let { movie ->
MovieCard(
imageUrl = movie.posterImageUrl,
title = movie.title,
votes = movie.votesAverage,
description = movie.overview,
onClick = { onSelectMovie(movie) }
)
}
if (lazyPagingItems.loadState.refresh == LoadState.Loading) {
BubbleLoader(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.secondary
)
} else {
when (lazyPagingItems.itemCount) {
0 -> {
EmptyState(
modifier = Modifier.align(Alignment.Center),
)
}
else -> {
MovieListInternal(
lazyListState = lazyListState,
modifier = modifier,
itemFactory = {
items(
count = lazyPagingItems.itemCount,
key = lazyPagingItems.itemKey(),
contentType = lazyPagingItems.itemContentType()
) { index ->
lazyPagingItems[index]?.let { movie ->
MovieCard(
imageUrl = movie.posterImageUrl,
title = movie.title,
votes = movie.votesAverage,
description = movie.overview,
onClick = { onSelectMovie(movie) }
)
}
}
}
)
}
}
)
}
}

@Composable
fun MovieList(
movies: List<Movie>,
fun BoxScope.MovieList(
movies: List<Movie>?,
lazyListState: LazyListState,
isLoading: Boolean,
onSelectMovie: (Movie) -> Unit,
modifier: Modifier = Modifier
) {
MovieListInternal(
modifier = modifier,
lazyListState = lazyListState,
itemFactory = {
items(
count = movies.size,
) { index ->
if (isLoading) {
BubbleLoader(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.secondary
)
} else {
when {
movies?.isEmpty() == true -> {
EmptyState(
modifier = Modifier.align(Alignment.Center),
)
}

movies[index].let { movie ->
MovieCard(
imageUrl = movie.posterImageUrl,
title = movie.title,
votes = movie.votesAverage,
description = movie.overview,
onClick = { onSelectMovie(movie) }
)
}
else -> {
val moviesList = movies ?: emptyList()

MovieListInternal(
modifier = modifier,
lazyListState = lazyListState,
itemFactory = {
items(
count = moviesList.size,
) { index ->

moviesList[index].let { movie ->
MovieCard(
imageUrl = movie.posterImageUrl,
title = movie.title,
votes = movie.votesAverage,
description = movie.overview,
onClick = { onSelectMovie(movie) }
)
}
}
}
)
}
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
Expand Down Expand Up @@ -114,20 +113,13 @@ fun BaseHomeScreenTab(
end = 16.dp,
)
if (uiState.selectedMovieType == MovieListType.FAVORITE) {
if (uiState.isLoading) {
BubbleLoader(
modifier = Modifier.align(Alignment.Center),
color = MaterialTheme.colorScheme.secondary
)
} else {
MovieList(
movies = uiState.favoriteMovies
?: emptyList(),
onSelectMovie = onSelectMovie,
lazyListState = lazyListState,
modifier = modifier,
)
}
MovieList(
movies = uiState.favoriteMovies,
isLoading = uiState.isLoading,
onSelectMovie = onSelectMovie,
lazyListState = lazyListState,
modifier = modifier,
)
} else {
MoviesListPaginated(
pagingDataFlow = uiState.paginatedMovies,
Expand All @@ -154,4 +146,12 @@ fun BaseHomeScreenTab(
}
}
)


LaunchedEffect(
key1 = Unit,
block = {
viewModel.setup()
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch

class HomeViewModel(
movieListType: MovieListType,
private val movieListType: MovieListType,
private val getFavoriteMoviesUseCase: GetFavoriteMoviesUseCase,
private val getTopRatedMoviesUseCase: GetTopRatedMoviesUseCase,
private val getPopularMoviesUseCase: GetPopularMoviesUseCase
Expand All @@ -41,6 +41,12 @@ class HomeViewModel(
}
}

fun setup() {
if(movieListType == MovieListType.FAVORITE) {
loadFavoriteMovies()
}
}

private fun loadFavoriteMovies() {
viewModelScope.launch {
_uiState.update {
Expand Down

0 comments on commit adae480

Please sign in to comment.