11package to.bitkit.ui
22
3+ import androidx.compose.animation.AnimatedContentScope
4+ import androidx.compose.animation.AnimatedContentTransitionScope
5+ import androidx.compose.animation.EnterTransition
6+ import androidx.compose.animation.ExitTransition
37import androidx.compose.runtime.Composable
48import androidx.compose.runtime.CompositionLocalProvider
59import androidx.compose.runtime.DisposableEffect
@@ -16,9 +20,12 @@ import androidx.lifecycle.Lifecycle
1620import androidx.lifecycle.LifecycleEventObserver
1721import androidx.lifecycle.compose.LocalLifecycleOwner
1822import androidx.lifecycle.compose.collectAsStateWithLifecycle
23+ import androidx.navigation.NavBackStackEntry
1924import androidx.navigation.NavController
25+ import androidx.navigation.NavDeepLink
2026import androidx.navigation.NavGraphBuilder
2127import androidx.navigation.NavHostController
28+ import androidx.navigation.NavType
2229import androidx.navigation.compose.NavHost
2330import androidx.navigation.compose.composable
2431import androidx.navigation.compose.navigation
@@ -84,6 +91,7 @@ import to.bitkit.viewmodels.ExternalNodeViewModel
8491import to.bitkit.viewmodels.MainScreenEffect
8592import to.bitkit.viewmodels.TransferViewModel
8693import to.bitkit.viewmodels.WalletViewModel
94+ import kotlin.reflect.KType
8795
8896@Composable
8997fun ContentView (
@@ -439,12 +447,7 @@ private fun NavGraphBuilder.settings(
439447 viewModel : WalletViewModel ,
440448 navController : NavHostController ,
441449) {
442- composable<Routes .Settings >(
443- enterTransition = { screenSlideIn },
444- exitTransition = { screenScaleOut },
445- popEnterTransition = { screenScaleIn },
446- popExitTransition = { screenSlideOut },
447- ) {
450+ composableWithDefaultTransitions<Routes .Settings > {
448451 SettingsScreen (viewModel, navController)
449452 }
450453}
@@ -462,12 +465,7 @@ private fun NavGraphBuilder.nodeState(
462465}
463466
464467private fun NavGraphBuilder.generalSettings (navController : NavHostController ) {
465- composable<Routes .GeneralSettings >(
466- enterTransition = { screenSlideIn },
467- exitTransition = { screenScaleOut },
468- popEnterTransition = { screenScaleIn },
469- popExitTransition = { screenSlideOut },
470- ) {
468+ composableWithDefaultTransitions<Routes .GeneralSettings > {
471469 GeneralSettingsScreen (navController)
472470 }
473471}
@@ -476,12 +474,7 @@ private fun NavGraphBuilder.defaultUnitSettings(
476474 currencyViewModel : CurrencyViewModel ,
477475 navController : NavHostController ,
478476) {
479- composable<Routes .DefaultUnitSettings >(
480- enterTransition = { screenSlideIn },
481- exitTransition = { screenScaleOut },
482- popEnterTransition = { screenScaleIn },
483- popExitTransition = { screenSlideOut },
484- ) {
477+ composableWithDefaultTransitions<Routes .DefaultUnitSettings > {
485478 DefaultUnitSettingsScreen (currencyViewModel, navController)
486479 }
487480}
@@ -490,64 +483,39 @@ private fun NavGraphBuilder.localCurrencySettings(
490483 currencyViewModel : CurrencyViewModel ,
491484 navController : NavHostController ,
492485) {
493- composable<Routes .LocalCurrencySettings >(
494- enterTransition = { screenSlideIn },
495- exitTransition = { screenScaleOut },
496- popEnterTransition = { screenScaleIn },
497- popExitTransition = { screenSlideOut },
498- ) {
486+ composableWithDefaultTransitions<Routes .LocalCurrencySettings > {
499487 LocalCurrencySettingsScreen (currencyViewModel, navController)
500488 }
501489}
502490
503491private fun NavGraphBuilder.backupSettings (
504492 navController : NavHostController ,
505493) {
506- composable<Routes .BackupSettings >(
507- enterTransition = { screenSlideIn },
508- exitTransition = { screenScaleOut },
509- popEnterTransition = { screenScaleIn },
510- popExitTransition = { screenSlideOut },
511- ) {
494+ composableWithDefaultTransitions<Routes .BackupSettings > {
512495 BackupSettingsScreen (navController)
513496 }
514497}
515498
516499private fun NavGraphBuilder.backupWalletSettings (
517500 navController : NavHostController ,
518501) {
519- composable<Routes .BackupWalletSettings >(
520- enterTransition = { screenSlideIn },
521- exitTransition = { screenScaleOut },
522- popEnterTransition = { screenScaleIn },
523- popExitTransition = { screenSlideOut },
524- ) {
502+ composableWithDefaultTransitions<Routes .BackupWalletSettings > {
525503 BackupWalletScreen (navController)
526504 }
527505}
528506
529507private fun NavGraphBuilder.restoreWalletSettings (
530508 navController : NavHostController ,
531509) {
532- composable<Routes .RestoreWalletSettings >(
533- enterTransition = { screenSlideIn },
534- exitTransition = { screenScaleOut },
535- popEnterTransition = { screenScaleIn },
536- popExitTransition = { screenSlideOut },
537- ) {
510+ composableWithDefaultTransitions<Routes .RestoreWalletSettings > {
538511 RestoreWalletScreen (navController)
539512 }
540513}
541514
542515private fun NavGraphBuilder.channelOrdersSettings (
543516 navController : NavHostController ,
544517) {
545- composable<Routes .ChannelOrdersSettings >(
546- enterTransition = { screenSlideIn },
547- exitTransition = { screenScaleOut },
548- popEnterTransition = { screenScaleIn },
549- popExitTransition = { screenSlideOut },
550- ) {
518+ composableWithDefaultTransitions<Routes .ChannelOrdersSettings > {
551519 ChannelOrdersScreen (
552520 onBackClick = { navController.popBackStack() },
553521 onOrderItemClick = { navController.navigateToOrderDetail(it) },
@@ -559,12 +527,7 @@ private fun NavGraphBuilder.channelOrdersSettings(
559527private fun NavGraphBuilder.orderDetailSettings (
560528 navController : NavHostController ,
561529) {
562- composable<Routes .OrderDetail >(
563- enterTransition = { screenSlideIn },
564- exitTransition = { screenScaleOut },
565- popEnterTransition = { screenScaleIn },
566- popExitTransition = { screenSlideOut },
567- ) { navBackEntry ->
530+ composableWithDefaultTransitions<Routes .OrderDetail > { navBackEntry ->
568531 OrderDetailScreen (
569532 orderItem = navBackEntry.toRoute(),
570533 onBackClick = { navController.popBackStack() },
@@ -575,12 +538,7 @@ private fun NavGraphBuilder.orderDetailSettings(
575538private fun NavGraphBuilder.cjitDetailSettings (
576539 navController : NavHostController ,
577540) {
578- composable<Routes .CjitDetail >(
579- enterTransition = { screenSlideIn },
580- exitTransition = { screenScaleOut },
581- popEnterTransition = { screenScaleIn },
582- popExitTransition = { screenSlideOut },
583- ) { navBackEntry ->
541+ composableWithDefaultTransitions<Routes .CjitDetail > { navBackEntry ->
584542 CJitDetailScreen (
585543 cjitItem = navBackEntry.toRoute(),
586544 onBackClick = { navController.popBackStack() },
@@ -592,12 +550,7 @@ private fun NavGraphBuilder.lightning(
592550 viewModel : WalletViewModel ,
593551 navController : NavHostController ,
594552) {
595- composable<Routes .Lightning >(
596- enterTransition = { screenSlideIn },
597- exitTransition = { screenScaleOut },
598- popEnterTransition = { screenScaleIn },
599- popExitTransition = { screenSlideOut },
600- ) {
553+ composableWithDefaultTransitions<Routes .Lightning > {
601554 LightningSettingsScreen (viewModel, navController)
602555 }
603556}
@@ -606,25 +559,15 @@ private fun NavGraphBuilder.devSettings(
606559 viewModel : WalletViewModel ,
607560 navController : NavHostController ,
608561) {
609- composable<Routes .DevSettings >(
610- enterTransition = { screenSlideIn },
611- exitTransition = { screenScaleOut },
612- popEnterTransition = { screenScaleIn },
613- popExitTransition = { screenSlideOut },
614- ) {
562+ composableWithDefaultTransitions<Routes .DevSettings > {
615563 DevSettingsScreen (viewModel, navController)
616564 }
617565}
618566
619567private fun NavGraphBuilder.regtestSettings (
620568 navController : NavHostController ,
621569) {
622- composable<Routes .RegtestSettings >(
623- enterTransition = { screenSlideIn },
624- exitTransition = { screenScaleOut },
625- popEnterTransition = { screenScaleIn },
626- popExitTransition = { screenSlideOut },
627- ) {
570+ composableWithDefaultTransitions<Routes .RegtestSettings > {
628571 val viewModel = hiltViewModel<BlocktankRegtestViewModel >()
629572 BlocktankRegtestScreen (viewModel, navController)
630573 }
@@ -634,12 +577,7 @@ private fun NavGraphBuilder.allActivity(
634577 viewModel : ActivityListViewModel ,
635578 navController : NavHostController ,
636579) {
637- composable<Routes .AllActivity >(
638- enterTransition = { screenSlideIn },
639- exitTransition = { screenScaleOut },
640- popEnterTransition = { screenScaleIn },
641- popExitTransition = { screenSlideOut },
642- ) {
580+ composableWithDefaultTransitions<Routes .AllActivity > {
643581 AllActivityScreen (
644582 viewModel = viewModel,
645583 onBackCLick = { navController.popBackStack() },
@@ -652,12 +590,7 @@ private fun NavGraphBuilder.activityItem(
652590 viewModel : ActivityListViewModel ,
653591 navController : NavHostController ,
654592) {
655- composable<Routes .ActivityItem >(
656- enterTransition = { screenSlideIn },
657- exitTransition = { screenScaleOut },
658- popEnterTransition = { screenScaleIn },
659- popExitTransition = { screenSlideOut },
660- ) { navBackEntry ->
593+ composableWithDefaultTransitions<Routes .ActivityItem > { navBackEntry ->
661594 ActivityItemScreen (
662595 viewModel = viewModel,
663596 activityItem = navBackEntry.toRoute(),
@@ -685,6 +618,29 @@ private fun NavGraphBuilder.qrScanner(
685618}
686619// endregion
687620
621+ /* *
622+ * Adds the [Composable] to the [NavGraphBuilder] with the default screen transitions.
623+ */
624+ inline fun <reified T : Any > NavGraphBuilder.composableWithDefaultTransitions (
625+ typeMap : Map <KType , NavType <* >> = emptyMap(),
626+ deepLinks : List <NavDeepLink > = emptyList(),
627+ noinline enterTransition : (AnimatedContentTransitionScope <NavBackStackEntry >.() -> EnterTransition ? )? = { screenSlideIn },
628+ noinline exitTransition : (AnimatedContentTransitionScope <NavBackStackEntry >.() -> ExitTransition ? )? = { screenScaleOut },
629+ noinline popEnterTransition : (AnimatedContentTransitionScope <NavBackStackEntry >.() -> EnterTransition ? )? = { screenScaleIn },
630+ noinline popExitTransition : (AnimatedContentTransitionScope <NavBackStackEntry >.() -> ExitTransition ? )? = { screenSlideOut },
631+ noinline content : @Composable AnimatedContentScope .(NavBackStackEntry ) -> Unit ,
632+ ) {
633+ composable<T >(
634+ typeMap = typeMap,
635+ deepLinks = deepLinks,
636+ enterTransition = enterTransition,
637+ exitTransition = exitTransition,
638+ popEnterTransition = popEnterTransition,
639+ popExitTransition = popExitTransition,
640+ content = content,
641+ )
642+ }
643+
688644// region events
689645fun NavController.navigateToHome () = navigate(
690646 route = Routes .Home ,
0 commit comments