package com.suno.android.ui.screens.home.profile.settings import android.content.Context import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold 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.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import com.suno.android.common_core_utils.extensions.xGetVersionCode import com.suno.android.common_core_utils.extensions.xGetVersionName import com.suno.android.common_ui.animations.NavigationFadeInAnimation import com.suno.android.common_ui.animations.NavigationFadeOutAnimation import com.suno.android.common_ui.components.easter.EasterEggScreen import com.suno.android.common_ui.effects.LaunchCustomTabEffect import com.suno.android.ui.screens.home.profile.settings.appearance.SettingsAppearanceScreen import com.suno.android.ui.screens.home.profile.settings.overview.SettingsOverviewScreen import com.suno.android.ui.screens.home.profile.settings.scratch.SettingsScratchScreen import com.suno.android.ui.screens.navigation.NavDestination import com.suno.feature_tweaks.TweaksNavDestination import java.net.URLEncoder private const val REPORT_PROBLEM_BASE_URL = "https://sunomusic.typeform.com/to/xC3Waspy" private const val SUPPORT_URL = "https://help.suno.com/" @Composable fun SettingsNavGraph( vm: SettingsNavGraphVM, rootNavHostController: NavHostController, ) { val settingsNavController = rememberNavController() LaunchedEffect(settingsNavController) { settingsNavController.addOnDestinationChangedListener { _, destination, _ -> vm.trackScreen(destination.route) } } Scaffold { innerPadding -> Box( modifier = Modifier .fillMaxSize() .padding(innerPadding), ) { NavHost( navController = settingsNavController, startDestination = NavDestination.Settings.SettingsOverviewScreenDestination, enterTransition = { NavigationFadeInAnimation }, exitTransition = { NavigationFadeOutAnimation }, ) { composable { SettingsOverviewScreen( vm = hiltViewModel(), onBackPressed = { rootNavHostController.popBackStack() }, onBillingClicked = { rootNavHostController.navigate( route = NavDestination.Billing.BillingNavGraphDestination, ) }, onReportProblemClicked = { settingsNavController.navigate( route = NavDestination.Settings.SettingsReportProblemLinkScreenDestination, ) }, onSupportClicked = { settingsNavController.navigate( route = NavDestination.Settings.SettingsSupportLinkScreenDestination, ) }, onEasterTriggered = { settingsNavController.navigate( route = NavDestination.Settings.SettingsEasterScreenDestination, ) }, onAppearanceClicked = { settingsNavController.navigate( route = NavDestination.Settings.SettingsAppearanceScreenDestination, ) }, onTweaksClick = { settingsNavController.navigate( route = TweaksNavDestination, ) }, ) } composable { SettingsScratchScreen(vm = hiltViewModel()) } composable { SettingsAppearanceScreen( vm = hiltViewModel(), onBackPressed = { settingsNavController.popBackStack() }, ) } composable { val context = LocalContext.current LaunchCustomTabEffect( context = context, url = context.buildReportProblemUrl(), onSuccessfulLaunch = { settingsNavController.popBackStack() }, onException = { vm.logError(it) }, ) } composable { LaunchCustomTabEffect( context = LocalContext.current, url = SUPPORT_URL, onSuccessfulLaunch = { settingsNavController.popBackStack() }, onException = { vm.logError(it) }, ) } composable { EasterEggScreen() } vm.tweaksEntryPoint.tweaksDestination(this) } } } } private fun Context.buildReportProblemUrl(): String { val baseUrl = REPORT_PROBLEM_BASE_URL val version = xGetVersionName() val build = xGetVersionCode()?.toString() return if (version.isNotEmpty() && build != null) { val encodedVersion = URLEncoder.encode(version, "UTF-8") val encodedBuild = URLEncoder.encode(build, "UTF-8") "$baseUrl#app_version=$encodedVersion&app_build=$encodedBuild" } else { baseUrl } }