diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a8286507..970270691 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Show loading state on Spending tab when node is not running #875 ### Added +- Transfer from Savings button on empty Spending screen when savings balance exists #882 - Connection issues overlay with connectivity fixes across Send, Receive, and Transfer flows #878 - Lightning Connections empty state with onboarding screen #857 - Unified PIN management screen (enable/disable/change in one place) #857 diff --git a/app/src/main/java/to/bitkit/ui/ContentView.kt b/app/src/main/java/to/bitkit/ui/ContentView.kt index 073fb1767..11d9ab25c 100644 --- a/app/src/main/java/to/bitkit/ui/ContentView.kt +++ b/app/src/main/java/to/bitkit/ui/ContentView.kt @@ -815,6 +815,7 @@ private fun NavGraphBuilder.home( } composableWithDefaultTransitions { val hasSeenSavingsIntro by settingsViewModel.hasSeenSavingsIntro.collectAsStateWithLifecycle() + val hasSeenSpendingIntro by settingsViewModel.hasSeenSpendingIntro.collectAsStateWithLifecycle() val lightningState by walletViewModel.lightningState.collectAsStateWithLifecycle() val lightningActivities by activityListViewModel.lightningActivities.collectAsStateWithLifecycle() @@ -831,6 +832,13 @@ private fun NavGraphBuilder.home( navController.navigateToTransferSavingsAvailability() } }, + onTransferFromSavingsClick = { + if (!hasSeenSpendingIntro) { + navController.navigateToTransferSpendingIntro() + } else { + navController.navigateToTransferSpendingAmount() + } + }, onBackClick = { navController.popBackStack() }, ) } diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt index b10954e85..65e42a606 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt @@ -56,6 +56,7 @@ fun SpendingWalletScreen( onActivityItemClick: (String) -> Unit, onEmptyActivityRowClick: () -> Unit, onTransferToSavingsClick: () -> Unit, + onTransferFromSavingsClick: () -> Unit, onBackClick: () -> Unit, balances: BalanceState = LocalBalances.current, ) { @@ -69,6 +70,9 @@ fun SpendingWalletScreen( val hasChannels = channels.isNotEmpty() mutableStateOf(hasLnBalance && hasChannels) } + val canTransferFromSavings by remember(showEmptyState, balances.totalOnchainSats) { + mutableStateOf(showEmptyState && balances.totalOnchainSats > 0uL) + } Box( modifier = Modifier @@ -112,6 +116,23 @@ fun SpendingWalletScreen( ) } + if (canTransferFromSavings) { + VerticalSpacer(32.dp) + + SecondaryButton( + onClick = onTransferFromSavingsClick, + text = stringResource(R.string.lightning__funding__button1), + icon = { + Icon( + painter = painterResource(R.drawable.ic_transfer), + contentDescription = null, + modifier = Modifier.size(16.dp) + ) + }, + modifier = Modifier.testTag("TransferFromSavings") + ) + } + if (!showEmptyState) { Spacer(modifier = Modifier.height(32.dp)) @@ -163,6 +184,7 @@ private fun Preview() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState(totalLightningSats = 50_000u), ) @@ -183,6 +205,7 @@ private fun PreviewTransfer() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState( totalLightningSats = 50_000u, @@ -206,6 +229,7 @@ private fun PreviewNoActivity() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, balances = BalanceState(totalLightningSats = 50_000u), ) @@ -226,7 +250,29 @@ private fun PreviewEmpty() { onActivityItemClick = {}, onEmptyActivityRowClick = {}, onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, + onBackClick = {}, + ) + TabBar() + } + } +} + +@Preview(showSystemUi = true) +@Composable +private fun PreviewEmptyWithSavings() { + AppThemeSurface { + Box { + SpendingWalletScreen( + channels = persistentListOf(), + lightningActivities = persistentListOf(), + onAllActivityButtonClick = {}, + onActivityItemClick = {}, + onEmptyActivityRowClick = {}, + onTransferToSavingsClick = {}, + onTransferFromSavingsClick = {}, onBackClick = {}, + balances = BalanceState(totalOnchainSats = 100_000u), ) TabBar() }