const
val GRID_COLUMN =
2
@Composable
fun HomeRoute(
navController: NavHostController,
homeViewModel: HomeViewModel = hiltViewModel()
) {
val pokemonList = homeViewModel.pokemonPagingData.collectAsLazyPagingItems()
val searchQuery by homeViewModel.searchQuery.collectAsStateWithLifecycle()
when (pokemonList.loadState.refresh) {
is LoadState.Loading -> {
LoadingScreen()
}
is LoadState.Error -> {
val error = (pokemonList.loadState.refresh as LoadState.Error).error
ErrorScreen(errorMessage = error.message ?: ErrorCode.UNKNOWN_ERROR.message) {
pokemonList.retry()
}
}
else
-> {
HomeScreen(
pokemonList = pokemonList,
searchQuery = searchQuery,
onSearchQueryChange = { homeViewModel.updateSearchQuery(it) },
onSearch = { homeViewModel.applySearchQuery() },
onPokemonClick = { pokemonId ->
navController.navigate(
"detail/$pokemonId"
)
}
)
}
}
}
@Composable
fun HomeScreen(
pokemonList: LazyPagingItems<PokemonList>,
searchQuery: String,
onSearchQueryChange: (String) -> Unit,
onSearch: () -> Unit,
onPokemonClick: (Int) -> Unit
) {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.Black)
) {
SearchCard(
query = searchQuery,
onQueryChange = onSearchQueryChange,
onSearch = onSearch
)
Box(modifier = Modifier.fillMaxSize()) {
LazyVerticalGrid(
columns = GridCells.Fixed(GRID_COLUMN),
) {
items(pokemonList.itemCount) { index ->
val pokemon = pokemonList[index]
if
(pokemon !=
null
) {
PokemonCard(
pokemon = pokemon,
onClick = { onPokemonClick(pokemon.id) }
)
}
}
}
pokemonList.apply {
when {
loadState.append is LoadState.Loading -> {
LoadingScreen()
}
loadState.append is LoadState.Error -> {
val error = (loadState.append as LoadState.Error).error
ErrorScreen(
errorMessage = error.message ?: ErrorCode.UNKNOWN_ERROR.message
) {
retry()
}
}
}
}
}
}
}