Newer
Older
package cz.fel.barysole.ackeetesttask
import androidx.activity.compose.BackHandler
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import cz.fel.barysole.ackeetesttask.ui.screen.Screen
import cz.fel.barysole.ackeetesttask.ui.screen.ScreenAction
import cz.fel.barysole.ackeetesttask.ui.screen.characterdetail.CharacterDetailScreen
import cz.fel.barysole.ackeetesttask.ui.screen.characterlist.CharacterListScreen
import cz.fel.barysole.ackeetesttask.ui.screen.favorite.FavoriteCharacterListScreen
import kotlinx.coroutines.flow.Flow
@Composable
fun MyNavHost(
navController: NavHostController,
snackbarHostState: SnackbarHostState,
modifier: Modifier,
screenActionFlow: Flow<ScreenAction>,
onTopBarTitleChange: (String) -> Unit,
onTopBarFavoriteIconChange: (Boolean) -> Unit,
onScreenSelected: (Screen, List<Any>?) -> Unit
) {
NavHost(
navController,
startDestination = Screen.Characters.route,
modifier = modifier
) {
composable(Screen.Characters.route) {
CustomBackHandler(onScreenSelected)
CharacterListScreen(
snackbarHostState,
onItemSelected = { characterId ->
onScreenSelected(Screen.CharacterDetail, listOf(characterId))
composable(Screen.Favorite.route) {
CustomBackHandler(onScreenSelected)
FavoriteCharacterListScreen(
onItemSelected = { characterId ->
onScreenSelected(Screen.CharacterDetail, listOf(characterId))
composable(
Screen.CharacterDetail.route,
arguments = listOf(navArgument("characterId") { type = NavType.LongType })
) { backStackEntry ->
CustomBackHandler(onScreenSelected)
CharacterDetailScreen(
backStackEntry.arguments?.getLong("characterId"),
screenActionFlow,
onTopBarTitleChange,
onTopBarFavoriteIconChange
)
@Composable
fun CustomBackHandler(onScreenSelected: (Screen, List<Any>?) -> Unit) {
BackHandler(true) {
onScreenSelected(Screen.Previous, null)
}
}