package com.suno.android.ui.screens.navigation import com.suno.android.ui.screens.home.profile.followers.FollowScreenType import kotlinx.serialization.Serializable // Define a home destination that doesn't take any arguments sealed interface NavDestination { sealed interface Landing : NavDestination { @Serializable data object LandingNavGraphDestination : Landing @Serializable data object WelcomeScreenDestination : Landing @Serializable data class LoginScreenDestination( val isSignUp: Boolean, ) : Landing @Serializable data object TermsDestination : Landing @Serializable data object PrivacyPolicyDestination : Landing @Serializable data class ExternalOauthScreenDestination( val url: String, ) : Landing @Serializable data object InputPhoneNumberDestination : Landing @Serializable data class ValidatePhoneNumberDestination( val phoneNumber: String, val signUpId: String?, val signInId: String?, ) : Landing } sealed interface Onboarding : LoggedInNav { @Serializable data object OnboardingNavGraphDestination : Onboarding @Serializable data object WhatsYourNameScreenDestination : Onboarding @Serializable data object UsernameHandleScreenDestination : Onboarding @Serializable data object AddProfilePhotoScreenDestination : Onboarding @Serializable data object AllowNotificationsScreenDestination : Onboarding } sealed interface Create : NavDestination { @Serializable data class WorkspacesScreenDestination( val createPromptFormJson: String? = null, ) : Create @Serializable data class CreateNavGraphDestination( val createPromptFormJson: String? = null, ) : Create @Serializable data object CreateScreenModeSelectionDestination : Create @Serializable data object WorkspacesSearchScreenDestination : Create } sealed interface Profile : NavDestination { @Serializable data class ProfileNavGraphDestination( val userHandle: String, val isSelf: Boolean, val searchKey: String? = null, ) : Profile @Serializable data class ProfileScreenDestination( val userHandle: String, val isSelf: Boolean, val searchKey: String? = null, ) : Profile @Serializable data class ProfileFollowListDestination( val userHandle: String, val screenType: String = FollowScreenType.FOLLOWERS.screenTypeString, ) : Profile @Serializable data object EditProfileScreenDestination : NavDestination } sealed interface Settings : NavDestination { @Serializable data object SettingsNavGraphDestination : Settings @Serializable data object SettingsScratchScreenDestination : Settings // this destination is used for just testing some functionality @Serializable data object SettingsOverviewScreenDestination : Settings @Serializable data object SettingsAppearanceScreenDestination : Settings @Serializable data object SettingsReportProblemLinkScreenDestination : Settings @Serializable data object SettingsSupportLinkScreenDestination : Settings @Serializable data object SettingsEasterScreenDestination : Settings } sealed interface Billing : NavDestination { @Serializable data object BillingNavGraphDestination : Billing @Serializable data object BillingOptionsScreenDestination : Billing @Serializable data object BillingTopUpScreenDestination : Billing @Serializable data object BillingStripeRedirect : Billing @Serializable data object TermsDestination : Billing @Serializable data object PrivacyPolicyDestination : Billing @Serializable data object ContactUsDestination : Billing } sealed interface Home : NavDestination { @Serializable data object HomeScreenDestination : Home @Serializable data object ExploreScreenDestination : Home @Serializable data object ExploreSearchScreenDestination : Home @Serializable data object ExploreNotificationScreenDestination : Home @Serializable data object LibraryScreenDestination : Home @Serializable data object LibrarySearchScreenDestination : Home @Serializable data object MyProfileScreenDestination : Home @Serializable data object PlaylistsCollectionScreenDestination : Home @Serializable data class PlaylistScreenDestination( val playlistId: String? = null, val searchId: String? = null, val styleId: String? = null, val searchKey: String? = null, ) : Home @Serializable data object NotificationScreenDestination : Home @Serializable data object HooksFeedScreenDestination : Home @Serializable data object FollowingClipsScreenDestination : Home } sealed interface LoggedInNav : NavDestination { @Serializable data class LoggedInNavGraphDestination( val isOnboarding: Boolean, ) : LoggedInNav @Serializable data class OmniScreenDestination( val showCommentBottomSheet: Boolean? = false, ) : NavDestination @Serializable data class ShareAssetEditorDestination( val songId: String, ) : LoggedInNav @Serializable data class HooksCreateDestination( val songId: String, ) : Cloneable @Serializable data class HooksProfileFeedDestination( val userHandle: String, val startIndex: Int, ) : LoggedInNav @Serializable data class HooksSingleDestination( val hookId: String, val showCommentBottomSheet: Boolean = false, ) : LoggedInNav @Serializable data object OrpheusChatDestination : LoggedInNav } sealed interface LoggedOutNav : NavDestination { @Serializable data object LoggedOutNavGraphDestination : LoggedOutNav } @Serializable data object SplashScreenDestination : NavDestination }