package com.suno.android.ui.screens.onboarding import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.toRoute import com.suno.android.common_ui.animations.NavigationFadeInAnimation import com.suno.android.common_ui.animations.NavigationFadeOutAnimation import com.suno.android.common_ui.effects.LaunchCustomTabEffect import com.suno.android.ui.screens.navigation.NavDestination import com.suno.android.ui.screens.onboarding.login.LoginScreen import com.suno.android.ui.screens.onboarding.phone.input.LoginPhoneNumberScreen import com.suno.android.ui.screens.onboarding.phone.validate.LoginValidatePhoneNumberScreen import com.suno.android.ui.screens.onboarding.welcome.WelcomeScreen @Composable fun LandingNavGraph( landingNavGraphVM: LandingNavGraphVM = hiltViewModel(), redirectToOnboarding: () -> Unit, redirectToHome: () -> Unit, ) { val landingNavController = rememberNavController() LaunchedEffect(landingNavController) { landingNavController.addOnDestinationChangedListener { controller, destination, arguments -> landingNavGraphVM.trackScreen( screenName = destination.route, ) } } Box( modifier = Modifier.fillMaxSize(), ) { NavHost( navController = landingNavController, startDestination = NavDestination.Landing.WelcomeScreenDestination, enterTransition = { NavigationFadeInAnimation }, exitTransition = { NavigationFadeOutAnimation }, ) { composable { WelcomeScreen( vm = hiltViewModel(), onLoginClicked = { landingNavController.navigate( NavDestination.Landing.LoginScreenDestination( isSignUp = false, ), ) }, onSignUpClicked = { landingNavController.navigate( NavDestination.Landing.LoginScreenDestination( isSignUp = true, ), ) }, ) } composable { LoginScreen( vm = hiltViewModel(), onOauth = { isSignUp, externalRedirectUrl -> landingNavController.navigate( NavDestination.Landing.ExternalOauthScreenDestination( url = externalRedirectUrl.toString(), ), ) }, onPhoneAuthClicked = { isSignUp -> landingNavController.navigate( NavDestination.Landing.InputPhoneNumberDestination, ) }, onTermsClicked = { landingNavController.navigate(NavDestination.Landing.TermsDestination) }, onPrivacyPolicyClicked = { landingNavController.navigate(NavDestination.Landing.PrivacyPolicyDestination) }, ) } composable { LoginPhoneNumberScreen( vm = hiltViewModel(), onPhoneNumberEntered = { phoneAuthPayload -> landingNavController.navigate( NavDestination.Landing.ValidatePhoneNumberDestination( phoneNumber = phoneAuthPayload.phoneNumber, signInId = phoneAuthPayload.signInId, signUpId = phoneAuthPayload.signUpId, ), ) }, onBackPressed = { landingNavController.popBackStack() }, ) } composable { LoginValidatePhoneNumberScreen( vm = hiltViewModel(), onPhoneCodeValidated = { isSignUpFlow -> if (isSignUpFlow) { redirectToOnboarding.invoke() } else { redirectToHome.invoke() } }, onBackPressed = { landingNavController.popBackStack() }, ) } composable { backstackEntry -> val route = backstackEntry.toRoute() LaunchCustomTabEffect( context = LocalContext.current, url = route.url, onSuccessfulLaunch = { landingNavController.popBackStack() }, onException = { landingNavGraphVM.logError(it) }, ) } composable { LaunchCustomTabEffect( context = LocalContext.current, url = "https://suno.com/terms", onSuccessfulLaunch = { landingNavController.popBackStack() }, onException = { landingNavGraphVM.logError(it) }, ) } composable { LaunchCustomTabEffect( context = LocalContext.current, url = "https://suno.com/privacy", onSuccessfulLaunch = { landingNavController.popBackStack() }, onException = { landingNavGraphVM.logError(it) }, ) } } } }