Skip to content

Commit a32ec18

Browse files
committed
style(flipcash): migrate error messaging to use BottomBar's
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent e5e92ab commit a32ec18

18 files changed

Lines changed: 175 additions & 128 deletions

File tree

apps/flipcash/app/src/main/kotlin/com/flipcash/app/internal/ui/HomeViewModel.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,12 @@ import com.flipcash.app.shareable.ShareSheetController
1010
import com.flipcash.services.user.UserManager
1111
import com.getcode.manager.BottomBarAction
1212
import com.getcode.manager.BottomBarManager
13-
import com.getcode.manager.TopBarManager
1413
import com.getcode.util.resources.ResourceHelper
1514
import dagger.hilt.android.lifecycle.HiltViewModel
1615
import kotlinx.coroutines.delay
1716
import kotlinx.coroutines.flow.MutableStateFlow
1817
import kotlinx.coroutines.flow.SharingStarted
19-
import kotlinx.coroutines.flow.map
2018
import kotlinx.coroutines.flow.stateIn
21-
import kotlinx.coroutines.flow.take
2219
import kotlinx.coroutines.launch
2320
import javax.inject.Inject
2421

@@ -49,7 +46,7 @@ internal class HomeViewModel @Inject constructor(
4946
fun onMissingBiometrics() {
5047
// biometrics required by user, but now not enrolled
5148
// show a top bar error and let them in
52-
TopBarManager.showMessage(
49+
BottomBarManager.showError(
5350
resources.getString(R.string.error_title_missingBiometrics),
5451
resources.getString(R.string.error_description_missingBiometrics)
5552
)
@@ -81,11 +78,9 @@ internal class HomeViewModel @Inject constructor(
8178
authManager.logoutAndSwitchAccount(entropy)
8279
.onSuccess { onSwitchAccount() }
8380
.onFailure {
84-
TopBarManager.showMessage(
85-
TopBarManager.TopBarMessage(
86-
title = resources.getString(R.string.error_title_failedToLogOut),
87-
message = resources.getString(R.string.error_description_failedToLogOut),
88-
)
81+
BottomBarManager.showError(
82+
title = resources.getString(R.string.error_title_failedToLogOut),
83+
message = resources.getString(R.string.error_description_failedToLogOut),
8984
)
9085
}
9186
}

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/internal/errors/ErrorUtil.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ package com.flipcash.app.core.internal.errors
22

33
import android.content.Context
44
import com.flipcash.core.R
5-
import com.getcode.manager.TopBarManager
5+
import com.getcode.manager.BottomBarManager
66
import com.getcode.util.resources.ResourceHelper
77
import com.getcode.utils.ErrorUtils
88

9-
fun ErrorUtils.showNetworkError(context: Context) = TopBarManager.TopBarMessage(
10-
title = context.getString(R.string.error_title_noInternet),
11-
message = context.getString(R.string.error_description_noInternet),
12-
type = TopBarManager.TopBarMessageType.ERROR_NETWORK
13-
).let { TopBarManager.showMessage(it) }
9+
fun ErrorUtils.showNetworkError(context: Context) {
10+
BottomBarManager.showError(
11+
title = context.getString(R.string.error_title_noInternet),
12+
message = context.getString(R.string.error_description_noInternet)
13+
)
14+
}
1415

15-
fun ErrorUtils.showNetworkError(resources: ResourceHelper) = TopBarManager.TopBarMessage(
16-
title = resources.getString(R.string.error_title_noInternet),
17-
message =resources.getString(R.string.error_description_noInternet),
18-
type = TopBarManager.TopBarMessageType.ERROR_NETWORK
19-
).let { TopBarManager.showMessage(it) }
16+
fun ErrorUtils.showNetworkError(resources: ResourceHelper) {
17+
BottomBarManager.showError(
18+
title = resources.getString(R.string.error_title_noInternet),
19+
message = resources.getString(R.string.error_description_noInternet)
20+
)
21+
}

apps/flipcash/core/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
<string name="prompt_description_notFlipcashAccount">Only accounts created through Flipcash are currently supported</string>
88
<string name="action_createNewFlipcashAccount">Create a New Flipcash Account</string>
99
<string name="action_tryDifferentFlipcashAccount">Try a Different Flipcash Account</string>
10+
<string name="error_title_createAccountFailed">Create Account Failed</string>
11+
<string name="error_description_createAccountFailed">Something went wrong</string>
12+
<string name="error_title_loginFailed">Login Failed</string>
13+
<string name="error_description_loginFailed">Something went wrong</string>
1014

1115
<string name="title_finalizeAccountCreationWithWelcomeBonus">Pay %1$s, Get %2$s</string>
1216
<string name="subtitle_finalizeAccountCreationWithWelcomeBonus">For a limited time new accounts will receive a free welcome bonus of $20 of stablecoins</string>
@@ -27,6 +31,8 @@
2731
<string name="subtitle_accessKeySnapshotDescription">Tap the Google Lens icon to open the QR code to log into Flipcash. Alternatively you can log in manually by entering the 12 words in the Flipcash Log In screen</string>
2832
<string name="subtitle_accessKeySnapshotWarning">Warning! This image gives access to all the funds you have in Flipcash. Do not share this image with anyone else. Keep it secure and safe</string>
2933

34+
<string name="error_description_failedToSave">Please allow Flipcash access to Photos in Settings in order to save your Access Key.</string>
35+
3036
<string name="title_badge_no_connection">No Connection</string>
3137

3238
<string name="title_cash">Cash</string>

apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/internal/BackupKeyScreenContent.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.Manifest
44
import android.os.Build
55
import androidx.compose.animation.AnimatedVisibility
66
import androidx.compose.animation.core.MutableTransitionState
7-
import androidx.compose.animation.core.animateFloatAsState
87
import androidx.compose.animation.core.tween
98
import androidx.compose.animation.fadeIn
109
import androidx.compose.animation.fadeOut
@@ -30,7 +29,6 @@ import androidx.compose.runtime.remember
3029
import androidx.compose.runtime.setValue
3130
import androidx.compose.ui.Alignment
3231
import androidx.compose.ui.Modifier
33-
import androidx.compose.ui.draw.alpha
3432
import androidx.compose.ui.draw.scale
3533
import androidx.compose.ui.graphics.asImageBitmap
3634
import androidx.compose.ui.layout.ContentScale
@@ -42,9 +40,9 @@ import androidx.compose.ui.unit.dp
4240
import androidx.compose.ui.unit.isSpecified
4341
import com.flipcash.app.core.android.extensions.launchAppSettings
4442
import com.flipcash.features.backupkey.R
45-
import com.getcode.manager.TopBarManager
43+
import com.getcode.manager.BottomBarAction
44+
import com.getcode.manager.BottomBarManager
4645
import com.getcode.theme.CodeTheme
47-
import com.getcode.theme.White
4846
import com.getcode.ui.components.Cloudy
4947
import com.getcode.ui.components.SelectionContainer
5048
import com.getcode.ui.components.rememberSelectionState
@@ -73,14 +71,16 @@ internal fun BackupKeyScreenContent(viewModel: BackupKeyScreenViewModel) {
7371
isStoragePermissionGranted = result == PermissionResult.Granted
7472

7573
if (!isStoragePermissionGranted) {
76-
TopBarManager.showMessage(
77-
TopBarManager.TopBarMessage(
78-
title = context.getString(R.string.error_title_failedToSave),
79-
message = context.getString(R.string.error_description_failedToSave),
80-
type = TopBarManager.TopBarMessageType.ERROR,
81-
secondaryText = context.getString(R.string.action_openSettings),
82-
secondaryAction = { context.launchAppSettings() }
83-
)
74+
BottomBarManager.showError(
75+
title = context.getString(R.string.error_title_failedToSave),
76+
message = context.getString(R.string.error_description_failedToSave),
77+
additionalActions = listOf(
78+
BottomBarAction(
79+
text = context.getString(R.string.action_openSettings),
80+
style = BottomBarManager.BottomBarButtonStyle.Filled50,
81+
onClick = { context.launchAppSettings() }
82+
)
83+
),
8484
)
8585
}
8686
}

apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceViewModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.flipcash.features.balance.R
1111
import com.flipcash.services.user.UserManager
1212
import com.getcode.manager.BottomBarAction
1313
import com.getcode.manager.BottomBarManager
14-
import com.getcode.manager.TopBarManager
1514
import com.getcode.opencode.controllers.BalanceController
1615
import com.getcode.opencode.controllers.TransactionController
1716
import com.getcode.opencode.model.financial.LocalFiat
@@ -24,7 +23,6 @@ import kotlinx.coroutines.flow.launchIn
2423
import kotlinx.coroutines.flow.map
2524
import kotlinx.coroutines.flow.mapNotNull
2625
import kotlinx.coroutines.flow.onEach
27-
import kotlinx.coroutines.flow.stateIn
2826
import kotlinx.coroutines.launch
2927
import javax.inject.Inject
3028

@@ -102,7 +100,7 @@ internal class BalanceViewModel @Inject constructor(
102100
)
103101
}.onResult(
104102
onError = {
105-
TopBarManager.showMessage(
103+
BottomBarManager.showError(
106104
title = resources.getString(R.string.error_title_failedToCancelTransfer),
107105
message = resources.getString(R.string.error_description_failedToCancelTransfer),
108106
)

apps/flipcash/features/cash/src/main/kotlin/com/flipcash/app/cash/internal/CashScreenViewModel.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import androidx.lifecycle.viewModelScope
44
import com.flipcash.app.core.bill.Bill
55
import com.flipcash.app.core.ui.CurrencyHolder
66
import com.flipcash.features.cash.R
7-
import com.getcode.manager.TopBarManager
7+
import com.getcode.manager.BottomBarManager
88
import com.getcode.opencode.controllers.BalanceController
99
import com.getcode.opencode.controllers.TransactionController
1010
import com.getcode.opencode.exchange.Exchange
@@ -104,7 +104,7 @@ internal class CashScreenViewModel @Inject constructor(
104104

105105
val isOverBalance = enteredInUsdc > balanceInUsdc
106106
if (isOverBalance || conversionRate == Rate.ignore) {
107-
TopBarManager.showMessage(
107+
BottomBarManager.showError(
108108
resources.getString(R.string.error_title_insufficientFunds),
109109
resources.getString(R.string.error_description_insufficientFunds)
110110
)
@@ -119,7 +119,7 @@ internal class CashScreenViewModel @Inject constructor(
119119
val isOverLimit = amount > sendLimit.nextTransaction
120120
if (isOverLimit) {
121121
val currencySymbol = currency.selected?.symbol ?: "$"
122-
TopBarManager.showMessage(
122+
BottomBarManager.showError(
123123
resources.getString(R.string.error_title_giveLimitReached),
124124
resources.getString(R.string.error_description_giveLimitReached)
125125
.replaceParam(

apps/flipcash/features/login/src/main/kotlin/com/flipcash/app/login/internal/AccessKeyScreenContent.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import com.flipcash.app.theme.FlipcashDesignSystem
5252
import com.flipcash.features.login.R
5353
import com.getcode.manager.BottomBarAction
5454
import com.getcode.manager.BottomBarManager
55-
import com.getcode.manager.TopBarManager
5655
import com.getcode.navigation.core.LocalCodeNavigator
5756
import com.getcode.theme.CodeTheme
5857
import com.getcode.theme.White
@@ -84,14 +83,16 @@ internal fun AccessKeyScreen(viewModel: LoginAccessKeyViewModel, onCompleted: ()
8483
isStoragePermissionGranted = result == PermissionResult.Granted
8584

8685
if (!isStoragePermissionGranted) {
87-
TopBarManager.showMessage(
88-
TopBarManager.TopBarMessage(
89-
title = context.getString(R.string.error_title_failedToSave),
90-
message = context.getString(R.string.error_description_failedToSave),
91-
type = TopBarManager.TopBarMessageType.ERROR,
92-
secondaryText = context.getString(R.string.action_openSettings),
93-
secondaryAction = { context.launchAppSettings() }
94-
)
86+
BottomBarManager.showError(
87+
title = context.getString(R.string.error_title_failedToSave),
88+
message = context.getString(R.string.error_description_failedToSave),
89+
additionalActions = listOf(
90+
BottomBarAction(
91+
text = context.getString(R.string.action_openSettings),
92+
style = BottomBarManager.BottomBarButtonStyle.Filled50,
93+
onClick = { context.launchAppSettings() }
94+
)
95+
),
9596
)
9697
}
9798
}

apps/flipcash/features/login/src/main/kotlin/com/flipcash/app/login/router/LoginViewModel.kt

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package com.flipcash.app.login.router
22

33
import androidx.lifecycle.viewModelScope
44
import com.flipcash.app.auth.AuthManager
5-
import com.flipcash.app.core.internal.extensions.onSuccessWithDelay
6-
import com.getcode.manager.TopBarManager
5+
import com.flipcash.features.login.R
6+
import com.getcode.manager.BottomBarManager
7+
import com.getcode.util.resources.ResourceHelper
78
import com.getcode.utils.encodeBase64
89
import com.getcode.view.BaseViewModel2
910
import com.getcode.view.LoadingSuccessState
@@ -17,11 +18,11 @@ import kotlinx.coroutines.flow.mapNotNull
1718
import kotlinx.coroutines.flow.onEach
1819
import org.kin.sdk.base.tools.Base58
1920
import javax.inject.Inject
20-
import kotlin.time.Duration.Companion.seconds
2121

2222
@HiltViewModel
2323
class LoginViewModel @Inject constructor(
2424
private val authManager: AuthManager,
25+
private val resources: ResourceHelper,
2526
) : BaseViewModel2<LoginViewModel.State, LoginViewModel.Event>(
2627
initialState = State(),
2728
updateStateForEvent = updateStateForEvent
@@ -61,11 +62,9 @@ class LoginViewModel @Inject constructor(
6162
authManager.createAccount()
6263
.onFailure {
6364
dispatchEvent(Event.CreateFailed)
64-
TopBarManager.showMessage(
65-
TopBarManager.TopBarMessage(
66-
title = "Create Account Failed",
67-
message = it.localizedMessage ?: "Something went wrong"
68-
)
65+
BottomBarManager.showError(
66+
title = resources.getString(R.string.error_title_createAccountFailed),
67+
message = it.localizedMessage ?: resources.getString(R.string.error_description_createAccountFailed)
6968
)
7069
}.onSuccess {
7170
dispatchEvent(Event.OnAccountCreated)
@@ -83,22 +82,18 @@ class LoginViewModel @Inject constructor(
8382
Base58.decode(seed)
8483
}.onFailure {
8584
dispatchEvent(Event.LogInFailed)
86-
TopBarManager.showMessage(
87-
TopBarManager.TopBarMessage(
88-
title = "Login Failed",
89-
message = "Something went wrong"
90-
)
85+
BottomBarManager.showError(
86+
title = resources.getString(R.string.error_title_loginFailed),
87+
message = resources.getString(R.string.error_description_loginFailed),
9188
)
9289
return@mapNotNull null
9390
}.getOrNull()
9491

9592
val entropyB64 = entropy?.encodeBase64()
9693
if (seed.isBlank() || entropy?.size != 16) {
97-
TopBarManager.showMessage(
98-
TopBarManager.TopBarMessage(
99-
title = "Login Failed",
100-
message = "Something went wrong"
101-
)
94+
BottomBarManager.showError(
95+
title = resources.getString(R.string.error_title_loginFailed),
96+
message = resources.getString(R.string.error_description_loginFailed),
10297
)
10398
return@mapNotNull null
10499
}
@@ -124,11 +119,9 @@ class LoginViewModel @Inject constructor(
124119
isFromSelection = true
125120
).onFailure {
126121
dispatchEvent(Event.LogInFailed)
127-
TopBarManager.showMessage(
128-
TopBarManager.TopBarMessage(
129-
title = "Login Failed",
130-
message = it.localizedMessage ?: "Something went wrong"
131-
)
122+
BottomBarManager.showError(
123+
title = resources.getString(R.string.error_title_loginFailed),
124+
message = it.localizedMessage ?: resources.getString(R.string.error_description_loginFailed),
132125
)
133126
}.onSuccess {
134127
dispatchEvent(Event.LoggedInSuccessfully)

apps/flipcash/features/login/src/main/kotlin/com/flipcash/app/login/seed/SeedInputViewModel.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import com.flipcash.features.login.R
1111
import com.flipcash.services.analytics.FlipcashAnalyticsService
1212
import com.getcode.crypt.MnemonicPhrase
1313
import com.getcode.manager.BottomBarManager
14-
import com.getcode.manager.TopBarManager
1514
import com.getcode.navigation.core.CodeNavigator
1615
import com.getcode.opencode.managers.MnemonicManager
1716
import com.getcode.util.permissions.PermissionChecker
@@ -91,7 +90,7 @@ class SeedInputViewModel @Inject constructor(
9190
authManager.login(entropyB64, isFromSelection = isRestore)
9291
.onFailure {
9392
if (it is AuthManager.AuthManagerException.TimelockUnlockedException) {
94-
TopBarManager.showMessage(
93+
BottomBarManager.showError(
9594
getString(R.string.error_title_timelockUnlocked),
9695
getString(R.string.error_description_timelockUnlocked)
9796
)
@@ -131,7 +130,7 @@ class SeedInputViewModel @Inject constructor(
131130
when (error) {
132131
is SelectCredentialError.UserCancelled -> { /* no op */ }
133132
else -> {
134-
TopBarManager.showMessage(
133+
BottomBarManager.showError(
135134
getString(R.string.error_title_selectCredential),
136135
getString(R.string.error_description_selectCredential)
137136
)

apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenViewModel.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.flipcash.app.menu.internal
22

33
import androidx.lifecycle.viewModelScope
4-
import cafe.adriel.voyager.core.screen.Screen
54
import com.flipcash.app.auth.AuthManager
65
import com.flipcash.app.core.NavScreenProvider
76
import com.flipcash.app.core.android.VersionInfo
@@ -13,7 +12,6 @@ import com.flipcash.features.menu.R
1312
import com.flipcash.services.user.AuthState
1413
import com.flipcash.services.user.UserManager
1514
import com.getcode.manager.BottomBarManager
16-
import com.getcode.manager.TopBarManager
1715
import com.getcode.opencode.managers.MnemonicManager
1816
import com.getcode.util.resources.ResourceHelper
1917
import com.getcode.view.BaseViewModel2
@@ -22,7 +20,6 @@ import kotlinx.coroutines.delay
2220
import kotlinx.coroutines.flow.filter
2321
import kotlinx.coroutines.flow.filterIsInstance
2422
import kotlinx.coroutines.flow.filterNot
25-
import kotlinx.coroutines.flow.flatMapLatest
2623
import kotlinx.coroutines.flow.launchIn
2724
import kotlinx.coroutines.flow.map
2825
import kotlinx.coroutines.flow.mapNotNull
@@ -140,11 +137,9 @@ internal class MenuScreenViewModel @Inject constructor(
140137
dispatchEvent(Event.OnLoggedOutCompletely)
141138
}
142139
.onFailure {
143-
TopBarManager.showMessage(
144-
TopBarManager.TopBarMessage(
145-
title = resources.getString(R.string.error_title_failedToLogOut),
146-
message = resources.getString(R.string.error_description_failedToLogOut),
147-
)
140+
BottomBarManager.showError(
141+
title = resources.getString(R.string.error_title_failedToLogOut),
142+
message = resources.getString(R.string.error_description_failedToLogOut),
148143
)
149144
}
150145
}

0 commit comments

Comments
 (0)