diff --git a/src/main/kotlin/com/machiav3lli/fdroid/ui/navigation/NavHost.kt b/src/main/kotlin/com/machiav3lli/fdroid/ui/navigation/NavHost.kt new file mode 100644 index 00000000..822d568b --- /dev/null +++ b/src/main/kotlin/com/machiav3lli/fdroid/ui/navigation/NavHost.kt @@ -0,0 +1,84 @@ +package com.machiav3lli.fdroid.ui.navigation + +import androidx.compose.animation.AnimatedVisibilityScope +import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.activity +import com.google.accompanist.navigation.animation.AnimatedNavHost +import com.google.accompanist.navigation.animation.composable +import com.machiav3lli.fdroid.database.DatabaseX +import com.machiav3lli.fdroid.ui.activities.PrefsActivityX +import com.machiav3lli.fdroid.ui.fragments.Source +import com.machiav3lli.fdroid.ui.pages.ExplorePage +import com.machiav3lli.fdroid.ui.pages.InstalledPage +import com.machiav3lli.fdroid.ui.pages.LatestPage +import com.machiav3lli.fdroid.ui.viewmodels.MainNavFragmentViewModelX + +@OptIn(ExperimentalAnimationApi::class) +@Composable +fun MainNavHost( + modifier: Modifier = Modifier, + navController: NavHostController +) = + AnimatedNavHost( + modifier = modifier, + navController = navController, + startDestination = NavItem.Explore.destination + ) { + slideDownComposable(NavItem.Explore.destination) { + val viewModel = viewModel( + factory = MainNavFragmentViewModelX.Factory( + DatabaseX.getInstance(navController.context), + Source.AVAILABLE, + Source.AVAILABLE, + ) + ) + ExplorePage(viewModel) + } + slideDownComposable(route = NavItem.Latest.destination) { + val viewModel = viewModel( + factory = MainNavFragmentViewModelX.Factory( + DatabaseX.getInstance(navController.context), + Source.UPDATED, + Source.NEW, + ) + ) + LatestPage(viewModel) + } + slideDownComposable(NavItem.Installed.destination) { + val viewModel = viewModel( + factory = MainNavFragmentViewModelX.Factory( + DatabaseX.getInstance(navController.context), + Source.INSTALLED, + Source.UPDATES, + ) + ) + InstalledPage(viewModel) + } + activity(NavItem.Prefs.destination) { + this.activityClass = PrefsActivityX::class + } + } + +@OptIn(ExperimentalAnimationApi::class) +fun NavGraphBuilder.slideDownComposable( + route: String, + composable: @Composable (AnimatedVisibilityScope.(NavBackStackEntry) -> Unit) +) { + composable( + route, + enterTransition = { slideInVertically { height -> -height } + fadeIn() }, + exitTransition = { slideOutVertically { height -> height } + fadeOut() } + ) { + composable(it) + } +} \ No newline at end of file