package com.suno.android.ui.screens.home.profile import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier 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_core_utils.Id import com.suno.android.common_core_utils.model.UserHandle import com.suno.android.common_data.mappers.clips.SongListData import com.suno.android.common_ui.animations.NavigationFadeInAnimation import com.suno.android.common_ui.animations.NavigationFadeOutAnimation import com.suno.android.common_ui.extensions.windowInsetsPadding import com.suno.android.ui.screens.create.CreatePromptForm import com.suno.android.ui.screens.create.audio.CreateAudioState import com.suno.android.ui.screens.home.profile.followers.FollowScreenType import com.suno.android.ui.screens.home.profile.followers.ProfileFollowListScreen import com.suno.android.ui.screens.navigation.NavDestination @Composable fun ProfileNavGraph( vm: ProfileNavGraphVM = hiltViewModel(), isTopLevel: Boolean = false, userHandle: String, isSelf: Boolean, onBackPressed: () -> Unit, onUpgradeClicked: () -> Unit, onSettingsClicked: () -> Unit, onEditProfileClicked: () -> Unit, onPlaylistClicked: (playlistId: String) -> Unit, onReusePromptClicked: (CreatePromptForm) -> Unit, navigateToAssetEdit: (songId: Id) -> Unit, navigateToRemix: (songId: Id, task: CreateAudioState.AudioCreateTask) -> Unit, navigateToUserHooksFeed: (userHandle: UserHandle, startIndex: Int) -> Unit, searchKey: String? = null, ) { val profileNavController = rememberNavController() LaunchedEffect(profileNavController) { profileNavController.addOnDestinationChangedListener { controller, destination, arguments -> vm.trackScreen( screenName = destination.route, ) } } Scaffold { innerPadding -> Box( modifier = Modifier .fillMaxSize() .windowInsetsPadding(innerPadding), ) { NavHost( navController = profileNavController, startDestination = NavDestination.Profile.ProfileScreenDestination( userHandle = userHandle, isSelf = isSelf, searchKey = searchKey, ), enterTransition = { NavigationFadeInAnimation }, exitTransition = { NavigationFadeOutAnimation }, ) { composable { backStackEntry -> val route = backStackEntry.toRoute() ProfileScreen( vm = hiltViewModel(), isTopLevel = isTopLevel, onBackPressed = { onBackPressed.invoke() }, onSettingsClicked = { onSettingsClicked.invoke() }, onEditProfileClicked = { onEditProfileClicked.invoke() }, onPlaylistClicked = { playlistId: String -> onPlaylistClicked.invoke(playlistId) }, onReusePromptClicked = { createPromptForm: CreatePromptForm -> onReusePromptClicked.invoke(createPromptForm) }, navigateToAssetEdit = { songId: Id -> navigateToAssetEdit(songId) }, onUpgradeClicked = { onUpgradeClicked.invoke() }, navigateToUserHooksFeed = navigateToUserHooksFeed, navigateToRemix = navigateToRemix, navigateToFollowers = { profileNavController.navigate( NavDestination.Profile.ProfileFollowListDestination( userHandle = route.userHandle, screenType = FollowScreenType.FOLLOWERS.screenTypeString, ), ) }, navigateToFollowing = { profileNavController.navigate( NavDestination.Profile.ProfileFollowListDestination( userHandle = route.userHandle, screenType = FollowScreenType.FOLLOWING.screenTypeString, ), ) }, ) } composable { ProfileFollowListScreen( vm = hiltViewModel(), onNavigateToProfile = { userHandle -> profileNavController.navigate( NavDestination.Profile.ProfileScreenDestination( userHandle = userHandle, isSelf = false, ), ) }, onBackPressed = { profileNavController.popBackStack() }, ) } } } } }