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.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.suno.android.common_core_utils.extensions.xCheckNotificationPermissions import com.suno.android.common_res.R import com.suno.android.common_ui.animations.NavigationFadeInAnimation import com.suno.android.common_ui.animations.NavigationFadeOutAnimation import com.suno.android.ui.screens.navigation.NavDestination import com.suno.android.ui.screens.onboarding.add_profile_photo.OnboardingAddProfilePhotoScreen import com.suno.android.ui.screens.onboarding.allow_notifications.OnboardingAllowNotificationsScreen import com.suno.android.ui.screens.onboarding.username_handle.OnboardingUsernameHandleScreen import com.suno.android.ui.screens.onboarding.whats_your_name.OnboardingWhatsYourNameScreen @Composable fun OnboardingNavGraph( vm: OnboardingNavGraphVM = hiltViewModel(), onboardingComplete: () -> Unit, ) { val viewState: OnboardingNavGraphUiState by vm.viewStateFlow().collectAsStateWithLifecycle() val onboardingNavController = rememberNavController() val context = LocalContext.current val notificationPermissionsGranted = context.xCheckNotificationPermissions() val totalScreensString = when { !notificationPermissionsGranted && viewState.isAddProfilePhotoGateEnabled -> stringResource(R.string.number4) !notificationPermissionsGranted || viewState.isAddProfilePhotoGateEnabled -> stringResource(R.string.number3) else -> stringResource(R.string.number2) } LaunchedEffect(onboardingNavController) { onboardingNavController.addOnDestinationChangedListener { controller, destination, arguments -> vm.trackScreen( screenName = destination.route, ) } } LaunchedEffect(Unit) { vm.effects().collect { effect -> when (effect) { OnboardingNavGraphVM.OnboardingNavGraphEffects.RouteToWhatsYourName -> { onboardingNavController.navigate( route = NavDestination.Onboarding.WhatsYourNameScreenDestination, ) } OnboardingNavGraphVM.OnboardingNavGraphEffects.RouteToUsernameHandle -> { onboardingNavController.navigate( route = NavDestination.Onboarding.UsernameHandleScreenDestination, ) } OnboardingNavGraphVM.OnboardingNavGraphEffects.RouteToAddProfilePhoto -> { onboardingNavController.navigate( route = NavDestination.Onboarding.AddProfilePhotoScreenDestination, ) } OnboardingNavGraphVM.OnboardingNavGraphEffects.RouteToAllowNotifications -> { if (notificationPermissionsGranted) { onboardingComplete.invoke() } else { onboardingNavController.navigate( route = NavDestination.Onboarding.AllowNotificationsScreenDestination, ) } } OnboardingNavGraphVM.OnboardingNavGraphEffects.CompleteOnboarding -> { onboardingComplete.invoke() } } } } Box( modifier = Modifier.fillMaxSize(), ) { NavHost( navController = onboardingNavController, startDestination = NavDestination.Onboarding.WhatsYourNameScreenDestination, enterTransition = { NavigationFadeInAnimation }, exitTransition = { NavigationFadeOutAnimation }, ) { composable { OnboardingWhatsYourNameScreen( vm = hiltViewModel(), onReadyForNextScreen = { vm.navigateToUsernameHandleScreen() }, stepCountDisplay = "${stringResource(R.string.number1)}/$totalScreensString", ) } composable { OnboardingUsernameHandleScreen( vm = hiltViewModel(), onReadyForNextScreen = { if (viewState.isAddProfilePhotoGateEnabled) { vm.navigateToAddProfilePhotoScreen() } else { vm.navigateToAllowNotificationsScreen() } }, stepCountDisplay = "${stringResource(R.string.number2)}/$totalScreensString", ) } composable { OnboardingAddProfilePhotoScreen( vm = hiltViewModel(), onReadyForNextScreen = { if (notificationPermissionsGranted) { onboardingComplete.invoke() } else { vm.navigateToAllowNotificationsScreen() } }, stepCountDisplay = "${stringResource(R.string.number3)}/$totalScreensString", ) } composable { OnboardingAllowNotificationsScreen( vm = hiltViewModel(), onReadyForNextScreen = { vm.navigateToCompleteOnboarding() }, // Last step, either step 3/3, 4/4, or not displayed stepCountDisplay = if (!viewState.isAddProfilePhotoGateEnabled) { "${stringResource(R.string.number3)}/${stringResource(R.string.number3)}" } else { "${stringResource(R.string.number4)}/${stringResource(R.string.number4)}" }, ) } } } }