Skip to content

Commit c90b07e

Browse files
committed
fix: replace nested nav graph with flat navigation to fix HomeNav creating a nested NavHos without proper ViewmodelStore context
1 parent c5b75c8 commit c90b07e

File tree

4 files changed

+97
-208
lines changed

4 files changed

+97
-208
lines changed

app/src/main/java/to/bitkit/ui/ContentView.kt

Lines changed: 90 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import androidx.navigation.compose.composable
3636
import androidx.navigation.compose.currentBackStackEntryAsState
3737
import androidx.navigation.compose.rememberNavController
3838
import androidx.navigation.toRoute
39+
import dev.chrisbanes.haze.hazeSource
40+
import dev.chrisbanes.haze.rememberHazeState
3941
import kotlinx.coroutines.delay
4042
import kotlinx.coroutines.launch
4143
import kotlinx.serialization.Serializable
@@ -86,8 +88,9 @@ import to.bitkit.ui.screens.transfer.external.ExternalFeeCustomScreen
8688
import to.bitkit.ui.screens.transfer.external.ExternalNodeViewModel
8789
import to.bitkit.ui.screens.transfer.external.ExternalSuccessScreen
8890
import to.bitkit.ui.screens.transfer.external.LnurlChannelScreen
89-
import to.bitkit.ui.screens.wallets.HomeNav
90-
import to.bitkit.ui.screens.wallets.HomeRoutes
91+
import to.bitkit.ui.screens.wallets.HomeScreen
92+
import to.bitkit.ui.screens.wallets.SavingsWalletScreen
93+
import to.bitkit.ui.screens.wallets.SpendingWalletScreen
9194
import to.bitkit.ui.screens.wallets.activity.ActivityDetailScreen
9295
import to.bitkit.ui.screens.wallets.activity.ActivityExploreScreen
9396
import to.bitkit.ui.screens.wallets.activity.AllActivityScreen
@@ -167,6 +170,7 @@ import to.bitkit.ui.sheets.SendSheet
167170
import to.bitkit.ui.sheets.UpdateSheet
168171
import to.bitkit.ui.theme.TRANSITION_SHEET_MS
169172
import to.bitkit.ui.utils.AutoReadClipboardHandler
173+
import to.bitkit.ui.utils.RequestNotificationPermissions
170174
import to.bitkit.ui.utils.Transitions
171175
import to.bitkit.ui.utils.composableWithDefaultTransitions
172176
import to.bitkit.ui.utils.navigationWithDefaultTransitions
@@ -196,7 +200,6 @@ fun ContentView(
196200
modifier: Modifier = Modifier,
197201
) {
198202
val navController = rememberNavController()
199-
val walletNavController = rememberNavController()
200203

201204
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
202205
val context = LocalContext.current
@@ -439,7 +442,6 @@ fun ContentView(
439442
Box(modifier = Modifier.fillMaxSize()) {
440443
RootNavHost(
441444
navController = navController,
442-
walletNavController = walletNavController,
443445
drawerState = drawerState,
444446
walletViewModel = walletViewModel,
445447
appViewModel = appViewModel,
@@ -470,7 +472,7 @@ fun ContentView(
470472
DrawerMenu(
471473
drawerState = drawerState,
472474
rootNavController = navController,
473-
walletNavController = walletNavController,
475+
walletNavController = navController,
474476
hasSeenWidgetsIntro = hasSeenWidgetsIntro,
475477
hasSeenShopIntro = hasSeenShopIntro,
476478
modifier = Modifier.align(Alignment.TopEnd),
@@ -482,7 +484,6 @@ fun ContentView(
482484
@Composable
483485
private fun RootNavHost(
484486
navController: NavHostController,
485-
walletNavController: NavHostController,
486487
drawerState: DrawerState,
487488
walletViewModel: WalletViewModel,
488489
appViewModel: AppViewModel,
@@ -500,7 +501,6 @@ private fun RootNavHost(
500501
activityListViewModel = activityListViewModel,
501502
settingsViewModel = settingsViewModel,
502503
navController = navController,
503-
walletNavController = walletNavController,
504504
drawerState = drawerState,
505505
)
506506
allActivity(
@@ -638,10 +638,7 @@ private fun RootNavHost(
638638
SettingUpScreen(
639639
viewModel = transferViewModel,
640640
onContinueClick = {
641-
navController.navigateToHomeNested(
642-
walletNavController = walletNavController,
643-
nestedRoute = HomeRoutes.Home
644-
)
641+
navController.navigateToHome()
645642
}
646643
)
647644
}
@@ -753,18 +750,80 @@ private fun NavGraphBuilder.home(
753750
activityListViewModel: ActivityListViewModel,
754751
settingsViewModel: SettingsViewModel,
755752
navController: NavHostController,
756-
walletNavController: NavHostController,
757753
drawerState: DrawerState,
758754
) {
759755
composable<Routes.Home> {
760-
HomeNav(
761-
walletViewModel = walletViewModel,
762-
appViewModel = appViewModel,
763-
activityListViewModel = activityListViewModel,
764-
settingsViewModel = settingsViewModel,
765-
rootNavController = navController,
766-
walletNavController = walletNavController,
767-
drawerState = drawerState,
756+
val uiState by walletViewModel.uiState.collectAsStateWithLifecycle()
757+
val hazeState = rememberHazeState()
758+
759+
RequestNotificationPermissions(
760+
onPermissionChange = { granted ->
761+
settingsViewModel.setNotificationPreference(granted)
762+
}
763+
)
764+
Box(
765+
modifier = Modifier
766+
.fillMaxSize()
767+
.hazeSource(hazeState)
768+
) {
769+
HomeScreen(
770+
mainUiState = uiState,
771+
drawerState = drawerState,
772+
rootNavController = navController,
773+
walletNavController = navController,
774+
settingsViewModel = settingsViewModel,
775+
walletViewModel = walletViewModel,
776+
appViewModel = appViewModel,
777+
activityListViewModel = activityListViewModel,
778+
)
779+
}
780+
}
781+
composable<Routes.Savings>(
782+
enterTransition = { Transitions.slideInHorizontally },
783+
exitTransition = { Transitions.slideOutHorizontally },
784+
) {
785+
val hasSeenSpendingIntro by settingsViewModel.hasSeenSpendingIntro.collectAsStateWithLifecycle()
786+
val isGeoBlocked by appViewModel.isGeoBlocked.collectAsStateWithLifecycle()
787+
val onchainActivities by activityListViewModel.onchainActivities.collectAsStateWithLifecycle()
788+
789+
SavingsWalletScreen(
790+
isGeoBlocked = isGeoBlocked,
791+
onchainActivities = onchainActivities.orEmpty(),
792+
onAllActivityButtonClick = { navController.navigateToAllActivity() },
793+
onActivityItemClick = { navController.navigateToActivityItem(it) },
794+
onEmptyActivityRowClick = { appViewModel.showSheet(Sheet.Receive) },
795+
onTransferToSpendingClick = {
796+
if (!hasSeenSpendingIntro) {
797+
navController.navigateToTransferSpendingIntro()
798+
} else {
799+
navController.navigateToTransferSpendingAmount()
800+
}
801+
},
802+
onBackClick = { navController.popBackStack() },
803+
)
804+
}
805+
composable<Routes.Spending>(
806+
enterTransition = { Transitions.slideInHorizontally },
807+
exitTransition = { Transitions.slideOutHorizontally },
808+
) {
809+
val hasSeenSavingsIntro by settingsViewModel.hasSeenSavingsIntro.collectAsStateWithLifecycle()
810+
val uiState by walletViewModel.uiState.collectAsStateWithLifecycle()
811+
val lightningActivities by activityListViewModel.lightningActivities.collectAsStateWithLifecycle()
812+
813+
SpendingWalletScreen(
814+
uiState = uiState,
815+
lightningActivities = lightningActivities.orEmpty(),
816+
onAllActivityButtonClick = { navController.navigateToAllActivity() },
817+
onActivityItemClick = { navController.navigateToActivityItem(it) },
818+
onEmptyActivityRowClick = { appViewModel.showSheet(Sheet.Receive) },
819+
onTransferToSavingsClick = {
820+
if (!hasSeenSavingsIntro) {
821+
navController.navigateToTransferSavingsIntro()
822+
} else {
823+
navController.navigateToTransferSavingsAvailability()
824+
}
825+
},
826+
onBackClick = { navController.popBackStack() },
768827
)
769828
}
770829
}
@@ -1408,33 +1467,13 @@ fun NavController.navigateToHome() {
14081467
}
14091468
}
14101469

1470+
@Deprecated("Use navigateToHome() instead", ReplaceWith("navigateToHome()"))
14111471
fun NavController.navigateToHomeNested(
1412-
walletNavController: NavController?,
1413-
nestedRoute: Any?,
1472+
@Suppress("UNUSED_PARAMETER") walletNavController: NavController?,
1473+
@Suppress("UNUSED_PARAMETER") nestedRoute: Any?,
14141474
) {
1415-
// Handle nested navigation if provided
1416-
walletNavController?.run {
1417-
when (nestedRoute) {
1418-
is HomeRoutes.Home -> {
1419-
val popped = popBackStack<HomeRoutes.Home>(inclusive = false)
1420-
if (!popped) {
1421-
navigate(HomeRoutes.Home) {
1422-
popUpTo(graph.startDestinationId)
1423-
launchSingleTop = true
1424-
}
1425-
}
1426-
}
1427-
}
1428-
}
1429-
1430-
// Handle root navigation
1431-
val popped = popBackStack<Routes.Home>(inclusive = false)
1432-
if (!popped) {
1433-
navigate(Routes.Home) {
1434-
popUpTo(graph.startDestinationId)
1435-
launchSingleTop = true
1436-
}
1437-
}
1475+
// walletNavController and nestedRoute are no longer needed
1476+
navigateToHome()
14381477
}
14391478

14401479
fun NavController.navigateToAllActivity() {
@@ -1605,6 +1644,12 @@ sealed interface Routes {
16051644
@Serializable
16061645
data object Home : Routes
16071646

1647+
@Serializable
1648+
data object Savings : Routes
1649+
1650+
@Serializable
1651+
data object Spending : Routes
1652+
16081653
@Serializable
16091654
data object Settings : Routes
16101655

app/src/main/java/to/bitkit/ui/components/DrawerMenu.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ import androidx.compose.ui.unit.dp
3939
import androidx.compose.ui.unit.sp
4040
import androidx.compose.ui.zIndex
4141
import androidx.navigation.NavController
42+
import androidx.navigation.NavDestination.Companion.hasRoute
4243
import androidx.navigation.compose.rememberNavController
4344
import kotlinx.coroutines.launch
4445
import to.bitkit.R
4546
import to.bitkit.ui.Routes
4647
import to.bitkit.ui.navigateIfNotCurrent
47-
import to.bitkit.ui.navigateToHomeNested
48-
import to.bitkit.ui.screens.wallets.HomeRoutes
48+
import to.bitkit.ui.navigateToHome
4949
import to.bitkit.ui.shared.util.blockPointerInputPassthrough
5050
import to.bitkit.ui.shared.util.clickableAlpha
5151
import to.bitkit.ui.theme.AppThemeSurface
@@ -121,7 +121,7 @@ fun DrawerMenu(
121121
@Composable
122122
private fun Menu(
123123
rootNavController: NavController,
124-
walletNavController: NavController,
124+
@Suppress("UNUSED_PARAMETER") walletNavController: NavController,
125125
drawerState: DrawerState,
126126
onClickAddWidget: () -> Unit,
127127
onClickShop: () -> Unit,
@@ -141,10 +141,8 @@ private fun Menu(
141141
label = stringResource(R.string.wallet__drawer__wallet),
142142
iconRes = R.drawable.ic_coins,
143143
onClick = {
144-
rootNavController.navigateToHomeNested(
145-
walletNavController = walletNavController,
146-
nestedRoute = HomeRoutes.Home
147-
)
144+
val isInHome = rootNavController.currentBackStackEntry?.destination?.hasRoute<Routes.Home>() ?: false
145+
if (!isInHome) rootNavController.navigateToHome()
148146
scope.launch { drawerState.close() }
149147
},
150148
modifier = Modifier.testTag("DrawerWallet")

0 commit comments

Comments
 (0)