Add: Main NavHost

This commit is contained in:
machiav3lli 2022-09-16 04:36:30 +02:00
parent 815a39df60
commit 2aee70f09f

View File

@ -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<MainNavFragmentViewModelX>(
factory = MainNavFragmentViewModelX.Factory(
DatabaseX.getInstance(navController.context),
Source.AVAILABLE,
Source.AVAILABLE,
)
)
ExplorePage(viewModel)
}
slideDownComposable(route = NavItem.Latest.destination) {
val viewModel = viewModel<MainNavFragmentViewModelX>(
factory = MainNavFragmentViewModelX.Factory(
DatabaseX.getInstance(navController.context),
Source.UPDATED,
Source.NEW,
)
)
LatestPage(viewModel)
}
slideDownComposable(NavItem.Installed.destination) {
val viewModel = viewModel<MainNavFragmentViewModelX>(
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)
}
}