NavGraph.kt
The snippet can be accessed without any authentication.
Authored by
a6-alrashdi
NavGraph.kt 4.26 KiB
package com.example.match
import androidx.compose.runtime.Composable
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.example.match.ui.home.HomePage
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import com.example.match.ui.home.HomeViewModel
import com.example.match.ui.matchdetail.MatchDetailScreen
@Composable
fun AppNavHost() {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "splash"
) {
// Splash
composable("splash") {
SplashScreen(
onTimeout = {
navController.navigate("login") {
popUpTo("splash") { inclusive = true }
}
}
)
}
// Login
composable(
route = "login",
arguments = listOf(navArgument("fromApp") {
defaultValue = false
})
) { backStackEntry ->
val fromApp = backStackEntry.arguments?.getBoolean("fromApp") ?: false
val sessionViewModel: SessionViewModel = viewModel()
val loginViewModel: LoginViewModel = viewModel()
(if (!fromApp) {
{
sessionViewModel.setLoggedIn(false)
navController.navigate("home") { popUpTo("login") { inclusive = true } }
}
} else null)?.let {
LoginScreen(
loginViewModel = loginViewModel,
onSkip = it,
onLoginSuccess = {
sessionViewModel.setLoggedIn(true)
navController.navigate("home") { popUpTo("login") { inclusive = true } }
},
onRegisterClicked = { navController.navigate("register") },
onForgotPassword = { },
onClose = if (fromApp) {
{ navController.popBackStack() }
} else null
)
}
}
composable("register") {
RegisterScreen(
onRegisterSuccess = { successMsg ->
navController.navigate("home") {
popUpTo("register") { inclusive = true }
}
},
onAlreadyHaveAccount = { navController.navigate("login") }
)
}
// Home
composable("home") {
val viewModel: HomeViewModel = hiltViewModel()
val liveScores by viewModel.todayLiveScores.collectAsState()
val upcomingMatches by viewModel.upcomingMatches.collectAsState()
HomePage(
liveScores = liveScores,
upcomingMatches = upcomingMatches,
currentTab = "home",
onNavigationClick = { destination -> navController.navigate(destination) },
navController = navController // Pass navController here
)
}
composable("matchDetail/{matchId}") { backStackEntry ->
val matchId = backStackEntry.arguments?.getString("matchId") ?: ""
val sessionViewModel: SessionViewModel = viewModel()
val userId by sessionViewModel.userId.collectAsState()
MatchDetailScreen(
matchId = matchId,
userId = userId,
onBackClick = { navController.popBackStack() },
onRequireLogin = {
navController.navigate("login?fromApp=true")
}
)
}
composable("profile") {
ProfileScreen(
onClose = { navController.navigate("home") }
)
}
composable("settings") {
SettingsScreen(
onClose = { navController.navigate("home") }
)
}
}
}
Please register or sign in to comment