diff --git a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/FakeHomeRepository.kt b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/FakeHomeRepository.kt index 6340610..0980535 100644 --- a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/FakeHomeRepository.kt +++ b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/FakeHomeRepository.kt @@ -25,6 +25,7 @@ class FakeHomeRepository : HomeRepository { page: Int, onStart: () -> Unit, onComplete: () -> Unit, + onLastPageReached: () -> Unit, onError: (String?) -> Unit, ): Flow> = flowOf() } diff --git a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepository.kt b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepository.kt index eaa7ff8..402874f 100644 --- a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepository.kt +++ b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepository.kt @@ -27,6 +27,7 @@ interface HomeRepository { page: Int, onStart: () -> Unit, onComplete: () -> Unit, + onLastPageReached: () -> Unit, onError: (String?) -> Unit, ): Flow> } diff --git a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepositoryImpl.kt b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepositoryImpl.kt index fb7702e..effae23 100644 --- a/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepositoryImpl.kt +++ b/core/data/src/main/kotlin/com/skydoves/pokedex/compose/core/data/repository/home/HomeRepositoryImpl.kt @@ -48,6 +48,7 @@ class HomeRepositoryImpl @Inject constructor( page: Int, onStart: () -> Unit, onComplete: () -> Unit, + onLastPageReached: () -> Unit, onError: (String?) -> Unit, ) = flow { var pokemons = pokemonDao.getPokemonList(page).asDomain() @@ -58,6 +59,10 @@ class HomeRepositoryImpl @Inject constructor( */ val response = pokedexClient.fetchPokemonList(page = page) response.suspendOnSuccess { + if (data.next == null) { + onLastPageReached() + } + pokemons = data.results pokemons.forEach { pokemon -> pokemon.page = page } pokemonDao.insertPokemonList(pokemons.asEntity()) diff --git a/feature/home/src/main/kotlin/com/skydoves/pokedex/compose/feature/home/HomeViewModel.kt b/feature/home/src/main/kotlin/com/skydoves/pokedex/compose/feature/home/HomeViewModel.kt index 86ca4ca..a9c44be 100644 --- a/feature/home/src/main/kotlin/com/skydoves/pokedex/compose/feature/home/HomeViewModel.kt +++ b/feature/home/src/main/kotlin/com/skydoves/pokedex/compose/feature/home/HomeViewModel.kt @@ -36,6 +36,7 @@ class HomeViewModel @Inject constructor( ) : BaseViewModel() { internal val uiState: ViewModelStateFlow = viewModelStateFlow(HomeUiState.Loading) + private var isLastPageReached = false private val pokemonFetchingIndex: MutableStateFlow = MutableStateFlow(0) val pokemonList: StateFlow> = pokemonFetchingIndex.flatMapLatest { page -> @@ -43,6 +44,7 @@ class HomeViewModel @Inject constructor( page = page, onStart = { uiState.tryEmit(key, HomeUiState.Loading) }, onComplete = { uiState.tryEmit(key, HomeUiState.Idle) }, + onLastPageReached = { isLastPageReached = true }, onError = { uiState.tryEmit(key, HomeUiState.Error(it)) }, ) }.stateIn( @@ -52,7 +54,7 @@ class HomeViewModel @Inject constructor( ) fun fetchNextPokemonList() { - if (uiState.value != HomeUiState.Loading) { + if (uiState.value != HomeUiState.Loading && !isLastPageReached) { pokemonFetchingIndex.value++ } }