Skip to content

Commit

Permalink
pagination 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
Heyday7 committed Oct 17, 2022
1 parent c96cee2 commit 52477e6
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 11 deletions.
Expand Up @@ -21,6 +21,6 @@ class KtorMovieApi @Inject constructor(
language: String
): PaginationDTO<SimpleMovieDTO> =
networkService.get(
"$url/movie/now_playing?region=$region&language=$language"
"$url/movie/now_playing?page=$page&region=$region&language=$language"
)
}
27 changes: 22 additions & 5 deletions app/src/main/java/com/heyday7/movieapp/ui/home/HomeScreen.kt
@@ -1,16 +1,18 @@
package com.heyday7.movieapp.ui.home

import androidx.compose.foundation.Image
import android.util.Log
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.CircularProgressIndicator
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import coil.compose.rememberAsyncImagePainter
import com.heyday7.movieapp.model.SimpleMovie
import com.heyday7.movieapp.ui.core.component.NetworkImage
import com.heyday7.movieapp.ui.core.use
Expand All @@ -29,14 +31,29 @@ fun HomeScreen() {
contentPadding = PaddingValues(start = 12.dp, end = 12.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(
items = state.moviesNowPlaying
) { movie ->
itemsIndexed(
items = state.nowPlayingPaginationState.results,
key = {_, item -> "movie_${item.id}"}
) { index, movie ->
NowPlayingMovieItem(
modifier = Modifier
.size(width = 150.dp, height = 400.dp),
movie = movie
)

if (
index == state.nowPlayingPaginationState.results.lastIndex &&
state.nowPlayingPaginationState.paginationEnabled
) {
LaunchedEffect(Unit) {
dispatch(HomeViewModel.Event.NowPlayingEndReached)
}
}
}
if (state.nowPlayingPaginationState.isLoadingMore) {
item {
CircularProgressIndicator()
}
}
}
}
Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/com/heyday7/movieapp/ui/home/HomeViewModel.kt
Expand Up @@ -16,13 +16,24 @@ interface HomeViewModel :
data class State(
val movieId: Int = 76431,
val title: String = "",
val moviesNowPlaying: List<SimpleMovie> = emptyList()
val nowPlayingPaginationState: NowPlayingPaginationState = NowPlayingPaginationState()
)

data class NowPlayingPaginationState(
val results: List<SimpleMovie> = emptyList(),
val isLoading: Boolean = false,
val isLoadingMore: Boolean = false,
val page: Int = 1,
val totalPages: Int = 1,
) {
val paginationEnabled = !isLoadingMore && page < totalPages
}

sealed class Effect {}

sealed class Event {
object SearchButtonClicked : Event()
object NowPlayingEndReached : Event()
}

override val state: StateFlow<State>
Expand Down
@@ -1,6 +1,5 @@
package com.heyday7.movieapp.ui.main.viewmodel

import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.heyday7.movieapp.data.repository.MovieRepository
Expand All @@ -14,7 +13,7 @@ import javax.inject.Inject

@HiltViewModel
class RealHomeViewModel @Inject constructor(
movieRepository: MovieRepository,
private val movieRepository: MovieRepository,
private val navigator: ComposeNavigator
) : ViewModel(), HomeViewModel {
private val effectChannel = Channel<HomeViewModel.Effect>(Channel.UNLIMITED)
Expand All @@ -40,23 +39,84 @@ class RealHomeViewModel @Inject constructor(
}
}
movieRepository.getMovieNowPlaying(page = 1, language = "ko")
.onStart {
_state.update {
it.copy(
nowPlayingPaginationState = HomeViewModel.NowPlayingPaginationState(
isLoading = true,
page = 1
)
)
}
}
.onEach { pagination ->
_state.update {
it.copy(
moviesNowPlaying = pagination.results
nowPlayingPaginationState = it.nowPlayingPaginationState.copy(
results = pagination.results,
totalPages = pagination.totalPages
)
)
}
}
.onCompletion {
_state.update {
it.copy(
nowPlayingPaginationState = it.nowPlayingPaginationState.copy(
isLoading = false
)
)
}
}
.catch { e -> e.printStackTrace() }
.launchIn(viewModelScope)
}

private suspend fun loadMoreNowPlaying() {
val targetPage = _state.value.nowPlayingPaginationState.page + 1

_state.update {
it.copy(
nowPlayingPaginationState = it.nowPlayingPaginationState.copy(
isLoadingMore = true
)
)
}

kotlin.runCatching {
movieRepository.getMovieNowPlaying(targetPage).single()
}
.onSuccess { paginationResult ->
_state.update {
it.copy(
nowPlayingPaginationState = it.nowPlayingPaginationState.copy(
results = it.nowPlayingPaginationState.results + paginationResult.results,
page = paginationResult.page,
totalPages = paginationResult.totalPages
)
)
}
}
.onFailure { e -> e.printStackTrace() }

_state.update {
it.copy(
nowPlayingPaginationState = it.nowPlayingPaginationState.copy(
isLoadingMore = false
)
)
}
}

override fun event(event: HomeViewModel.Event) {
viewModelScope.launch {
when (event) {
HomeViewModel.Event.SearchButtonClicked -> {
is HomeViewModel.Event.SearchButtonClicked -> {
navigator.navigate("search")
}
is HomeViewModel.Event.NowPlayingEndReached -> {
loadMoreNowPlaying()
}
}
}
}
Expand Down

0 comments on commit 52477e6

Please sign in to comment.