Skip to content
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
.externalNativeBuild
.cxx
local.properties
.cursor

# Secrets
google-services.json
Expand Down
136 changes: 46 additions & 90 deletions app/src/main/java/to/bitkit/ui/ContentView.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package to.bitkit.ui

import androidx.compose.animation.AnimatedContentScope
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
Expand All @@ -16,9 +20,12 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavController
import androidx.navigation.NavDeepLink
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
Expand Down Expand Up @@ -84,6 +91,7 @@ import to.bitkit.viewmodels.ExternalNodeViewModel
import to.bitkit.viewmodels.MainScreenEffect
import to.bitkit.viewmodels.TransferViewModel
import to.bitkit.viewmodels.WalletViewModel
import kotlin.reflect.KType

@Composable
fun ContentView(
Expand Down Expand Up @@ -439,12 +447,7 @@ private fun NavGraphBuilder.settings(
viewModel: WalletViewModel,
navController: NavHostController,
) {
composable<Routes.Settings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.Settings> {
SettingsScreen(viewModel, navController)
}
}
Expand All @@ -462,12 +465,7 @@ private fun NavGraphBuilder.nodeState(
}

private fun NavGraphBuilder.generalSettings(navController: NavHostController) {
composable<Routes.GeneralSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.GeneralSettings> {
GeneralSettingsScreen(navController)
}
}
Expand All @@ -476,12 +474,7 @@ private fun NavGraphBuilder.defaultUnitSettings(
currencyViewModel: CurrencyViewModel,
navController: NavHostController,
) {
composable<Routes.DefaultUnitSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.DefaultUnitSettings> {
DefaultUnitSettingsScreen(currencyViewModel, navController)
}
}
Expand All @@ -490,64 +483,39 @@ private fun NavGraphBuilder.localCurrencySettings(
currencyViewModel: CurrencyViewModel,
navController: NavHostController,
) {
composable<Routes.LocalCurrencySettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.LocalCurrencySettings> {
LocalCurrencySettingsScreen(currencyViewModel, navController)
}
}

private fun NavGraphBuilder.backupSettings(
navController: NavHostController,
) {
composable<Routes.BackupSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.BackupSettings> {
BackupSettingsScreen(navController)
}
}

private fun NavGraphBuilder.backupWalletSettings(
navController: NavHostController,
) {
composable<Routes.BackupWalletSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.BackupWalletSettings> {
BackupWalletScreen(navController)
}
}

private fun NavGraphBuilder.restoreWalletSettings(
navController: NavHostController,
) {
composable<Routes.RestoreWalletSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.RestoreWalletSettings> {
RestoreWalletScreen(navController)
}
}

private fun NavGraphBuilder.channelOrdersSettings(
navController: NavHostController,
) {
composable<Routes.ChannelOrdersSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.ChannelOrdersSettings> {
ChannelOrdersScreen(
onBackClick = { navController.popBackStack() },
onOrderItemClick = { navController.navigateToOrderDetail(it) },
Expand All @@ -559,12 +527,7 @@ private fun NavGraphBuilder.channelOrdersSettings(
private fun NavGraphBuilder.orderDetailSettings(
navController: NavHostController,
) {
composable<Routes.OrderDetail>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) { navBackEntry ->
composableWithDefaultTransitions<Routes.OrderDetail> { navBackEntry ->
OrderDetailScreen(
orderItem = navBackEntry.toRoute(),
onBackClick = { navController.popBackStack() },
Expand All @@ -575,12 +538,7 @@ private fun NavGraphBuilder.orderDetailSettings(
private fun NavGraphBuilder.cjitDetailSettings(
navController: NavHostController,
) {
composable<Routes.CjitDetail>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) { navBackEntry ->
composableWithDefaultTransitions<Routes.CjitDetail> { navBackEntry ->
CJitDetailScreen(
cjitItem = navBackEntry.toRoute(),
onBackClick = { navController.popBackStack() },
Expand All @@ -592,12 +550,7 @@ private fun NavGraphBuilder.lightning(
viewModel: WalletViewModel,
navController: NavHostController,
) {
composable<Routes.Lightning>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.Lightning> {
LightningSettingsScreen(viewModel, navController)
}
}
Expand All @@ -606,25 +559,15 @@ private fun NavGraphBuilder.devSettings(
viewModel: WalletViewModel,
navController: NavHostController,
) {
composable<Routes.DevSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.DevSettings> {
DevSettingsScreen(viewModel, navController)
}
}

private fun NavGraphBuilder.regtestSettings(
navController: NavHostController,
) {
composable<Routes.RegtestSettings>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.RegtestSettings> {
val viewModel = hiltViewModel<BlocktankRegtestViewModel>()
BlocktankRegtestScreen(viewModel, navController)
}
Expand All @@ -634,12 +577,7 @@ private fun NavGraphBuilder.allActivity(
viewModel: ActivityListViewModel,
navController: NavHostController,
) {
composable<Routes.AllActivity>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) {
composableWithDefaultTransitions<Routes.AllActivity> {
AllActivityScreen(
viewModel = viewModel,
onBackCLick = { navController.popBackStack() },
Expand All @@ -652,12 +590,7 @@ private fun NavGraphBuilder.activityItem(
viewModel: ActivityListViewModel,
navController: NavHostController,
) {
composable<Routes.ActivityItem>(
enterTransition = { screenSlideIn },
exitTransition = { screenScaleOut },
popEnterTransition = { screenScaleIn },
popExitTransition = { screenSlideOut },
) { navBackEntry ->
composableWithDefaultTransitions<Routes.ActivityItem> { navBackEntry ->
ActivityItemScreen(
viewModel = viewModel,
activityItem = navBackEntry.toRoute(),
Expand Down Expand Up @@ -685,6 +618,29 @@ private fun NavGraphBuilder.qrScanner(
}
// endregion

/**
* Adds the [Composable] to the [NavGraphBuilder] with the default screen transitions.
*/
inline fun <reified T : Any> NavGraphBuilder.composableWithDefaultTransitions(
typeMap: Map<KType, NavType<*>> = emptyMap(),
deepLinks: List<NavDeepLink> = emptyList(),
noinline enterTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition?)? = { screenSlideIn },
noinline exitTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition?)? = { screenScaleOut },
noinline popEnterTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition?)? = { screenScaleIn },
noinline popExitTransition: (AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition?)? = { screenSlideOut },
noinline content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit,
) {
composable<T>(
typeMap = typeMap,
deepLinks = deepLinks,
enterTransition = enterTransition,
exitTransition = exitTransition,
popEnterTransition = popEnterTransition,
popExitTransition = popExitTransition,
content = content,
)
}

// region events
fun NavController.navigateToHome() = navigate(
route = Routes.Home,
Expand Down
Loading