Skip to content

Commit a66c94b

Browse files
committed
fix(savings): fix empty view and transfer button logic
+ feat(savings): hide transfer to spending if geo blocked + feat(savings): do not show empty view for 0 balance with existing activity
1 parent f669d54 commit a66c94b

File tree

5 files changed

+73
-20
lines changed

5 files changed

+73
-20
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ private fun RootNavHost(
537537
onAdvanced = { navController.navigate(Routes.FundingAdvanced) },
538538
onBackClick = { navController.popBackStack() },
539539
onCloseClick = { navController.navigateToHome() },
540-
isGeoBlocked = isGeoBlocked
540+
isGeoBlocked = isGeoBlocked,
541541
)
542542
}
543543
composableWithDefaultTransitions<Routes.FundingAdvanced> {

app/src/main/java/to/bitkit/ui/screens/wallets/HomeNav.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ private fun NavContent(
125125
exitTransition = { Transitions.slideOutHorizontally },
126126
) {
127127
val hasSeenSpendingIntro by settingsViewModel.hasSeenSpendingIntro.collectAsStateWithLifecycle()
128+
val isGeoBlocked by appViewModel.isGeoBlocked.collectAsStateWithLifecycle()
129+
val onchainActivities by activityListViewModel.onchainActivities.collectAsStateWithLifecycle()
130+
128131
SavingsWalletScreen(
132+
isGeoBlocked = isGeoBlocked,
133+
onchainActivities = onchainActivities.orEmpty(),
129134
onAllActivityButtonClick = { walletNavController.navigate(HomeRoutes.AllActivity) },
130135
onActivityItemClick = { rootNavController.navigateToActivityItem(it) },
131136
onEmptyActivityRowClick = { appViewModel.showSheet(Sheet.Receive) },

app/src/main/java/to/bitkit/ui/screens/wallets/SavingsWalletScreen.kt

Lines changed: 65 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.size
1414
import androidx.compose.foundation.layout.systemBarsPadding
1515
import androidx.compose.material3.Icon
1616
import androidx.compose.runtime.Composable
17-
import androidx.compose.runtime.collectAsState
1817
import androidx.compose.runtime.getValue
1918
import androidx.compose.runtime.mutableStateOf
2019
import androidx.compose.runtime.remember
@@ -26,31 +25,40 @@ import androidx.compose.ui.res.painterResource
2625
import androidx.compose.ui.res.stringResource
2726
import androidx.compose.ui.tooling.preview.Preview
2827
import androidx.compose.ui.unit.dp
28+
import com.synonym.bitkitcore.Activity
2929
import to.bitkit.R
3030
import to.bitkit.models.BalanceState
3131
import to.bitkit.ui.LocalBalances
32-
import to.bitkit.ui.activityListViewModel
3332
import to.bitkit.ui.components.BalanceHeaderView
3433
import to.bitkit.ui.components.EmptyStateView
3534
import to.bitkit.ui.components.SecondaryButton
3635
import to.bitkit.ui.scaffold.AppTopBar
3736
import to.bitkit.ui.scaffold.ScreenColumn
3837
import to.bitkit.ui.screens.wallets.activity.components.ActivityListGrouped
38+
import to.bitkit.ui.screens.wallets.activity.utils.previewOnchainActivityItems
3939
import to.bitkit.ui.theme.AppThemeSurface
4040
import to.bitkit.ui.theme.Colors
4141
import to.bitkit.ui.utils.withAccent
4242

4343
@Composable
4444
fun SavingsWalletScreen(
45+
isGeoBlocked: Boolean,
46+
onchainActivities: List<Activity>,
4547
onAllActivityButtonClick: () -> Unit,
4648
onEmptyActivityRowClick: () -> Unit,
4749
onActivityItemClick: (String) -> Unit,
4850
onTransferToSpendingClick: () -> Unit,
4951
onBackClick: () -> Unit,
5052
balances: BalanceState = LocalBalances.current,
5153
) {
52-
val showEmptyState by remember(balances.totalOnchainSats) {
53-
mutableStateOf(balances.totalOnchainSats == 0uL) // TODO use && hasOnchainActivity
54+
val showEmptyState by remember(balances.totalOnchainSats, onchainActivities.size) {
55+
val hasFunds = balances.totalOnchainSats > 0uL
56+
val hasActivity = onchainActivities.isNotEmpty()
57+
mutableStateOf(!hasFunds && !hasActivity)
58+
}
59+
val canTransfer by remember(balances.totalOnchainSats) {
60+
val hasFunds = balances.totalOnchainSats > 0uL
61+
mutableStateOf(hasFunds && !isGeoBlocked)
5462
}
5563

5664
Box(
@@ -85,21 +93,22 @@ fun SavingsWalletScreen(
8593
)
8694
if (!showEmptyState) {
8795
Spacer(modifier = Modifier.height(32.dp))
88-
SecondaryButton(
89-
onClick = onTransferToSpendingClick,
90-
text = "Transfer To Spending", // TODO add missing localized text
91-
icon = {
92-
Icon(
93-
painter = painterResource(R.drawable.ic_transfer),
94-
contentDescription = null,
95-
modifier = Modifier.size(16.dp),
96-
)
97-
},
98-
modifier = Modifier.testTag("TransferToSpending")
99-
)
10096

101-
val activity = activityListViewModel ?: return@Column
102-
val onchainActivities by activity.onchainActivities.collectAsState()
97+
if (canTransfer) {
98+
SecondaryButton(
99+
onClick = onTransferToSpendingClick,
100+
text = "Transfer To Spending", // TODO add missing localized text
101+
icon = {
102+
Icon(
103+
painter = painterResource(R.drawable.ic_transfer),
104+
contentDescription = null,
105+
modifier = Modifier.size(16.dp),
106+
)
107+
},
108+
modifier = Modifier.testTag("TransferToSpending")
109+
)
110+
}
111+
103112
ActivityListGrouped(
104113
items = onchainActivities,
105114
onActivityItemClick = onActivityItemClick,
@@ -126,6 +135,42 @@ fun SavingsWalletScreen(
126135
private fun Preview() {
127136
AppThemeSurface {
128137
SavingsWalletScreen(
138+
isGeoBlocked = false,
139+
onchainActivities = previewOnchainActivityItems(),
140+
onAllActivityButtonClick = {},
141+
onActivityItemClick = {},
142+
onEmptyActivityRowClick = {},
143+
onTransferToSpendingClick = {},
144+
onBackClick = {},
145+
balances = BalanceState(totalOnchainSats = 50_000u),
146+
)
147+
}
148+
}
149+
150+
@Preview(showSystemUi = true)
151+
@Composable
152+
private fun PreviewNoActivity() {
153+
AppThemeSurface {
154+
SavingsWalletScreen(
155+
isGeoBlocked = false,
156+
onchainActivities = emptyList(),
157+
onAllActivityButtonClick = {},
158+
onActivityItemClick = {},
159+
onEmptyActivityRowClick = {},
160+
onTransferToSpendingClick = {},
161+
onBackClick = {},
162+
balances = BalanceState(totalOnchainSats = 50_000u),
163+
)
164+
}
165+
}
166+
167+
@Preview(showSystemUi = true)
168+
@Composable
169+
private fun PreviewGeoBlocked() {
170+
AppThemeSurface {
171+
SavingsWalletScreen(
172+
isGeoBlocked = true,
173+
onchainActivities = previewOnchainActivityItems(),
129174
onAllActivityButtonClick = {},
130175
onActivityItemClick = {},
131176
onEmptyActivityRowClick = {},
@@ -141,6 +186,8 @@ private fun Preview() {
141186
private fun PreviewEmpty() {
142187
AppThemeSurface {
143188
SavingsWalletScreen(
189+
isGeoBlocked = false,
190+
onchainActivities = emptyList(),
144191
onAllActivityButtonClick = {},
145192
onActivityItemClick = {},
146193
onEmptyActivityRowClick = {},

app/src/main/java/to/bitkit/ui/screens/wallets/SpendingWalletScreen.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ fun SpendingWalletScreen(
5959
val canTransfer by remember(balances.totalLightningSats, uiState.channels.size) {
6060
val hasLnBalance = balances.totalLightningSats > 0uL
6161
val hasChannels = uiState.channels.isNotEmpty()
62-
6362
mutableStateOf(hasLnBalance && hasChannels)
6463
}
6564

app/src/main/java/to/bitkit/ui/screens/wallets/activity/utils/PreviewItems.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,5 @@ val previewActivityItems = buildList {
123123
)
124124
)
125125
}
126+
127+
fun previewOnchainActivityItems() = previewActivityItems.filter { it is Activity.Onchain }

0 commit comments

Comments
 (0)