Skip to content

Commit a4ceb3e

Browse files
committed
chore(onramp/phantom): add error messaging
Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 9496601 commit a4ceb3e

8 files changed

Lines changed: 75 additions & 44 deletions

File tree

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/phantom/PhantomConnectionResult.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ sealed class PhantomDeeplinkOrigin: Parcelable {
3737
@Parcelize
3838
data object Cash: PhantomDeeplinkOrigin()
3939

40+
@Parcelize
41+
data object Balance: PhantomDeeplinkOrigin()
42+
4043
@Parcelize
4144
data class PoolWithId(val id: ID) : PhantomDeeplinkOrigin()
4245

@@ -49,6 +52,7 @@ sealed class PhantomDeeplinkOrigin: Parcelable {
4952
is PoolWithRendezvous -> "pool-seed_${keyPair.seed.base64}"
5053
Menu -> "menu"
5154
Cash -> "cash"
55+
Balance -> "balance"
5256
}.lowercase()
5357
}
5458

@@ -61,6 +65,7 @@ sealed class PhantomDeeplinkOrigin: Parcelable {
6165
provider.rendezvous?.let { keyPair -> PoolWithRendezvous(keyPair) }
6266
provider.poolId?.let { id -> PoolWithId(id) }
6367
}
68+
is NavScreenProvider.HomeScreen.Balance -> Balance
6469

6570
else -> null
6671
}
@@ -70,6 +75,7 @@ sealed class PhantomDeeplinkOrigin: Parcelable {
7075
return when {
7176
value == "menu" -> Menu
7277
value == "cash" -> Cash
78+
value == "balance" -> Balance
7379
value?.startsWith("pool-") == true -> {
7480
val idStringWithPrefix = value.removePrefix("pool-")
7581
val splits = idStringWithPrefix.split("_")

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,4 +285,34 @@
285285
<string name="title_success">Success</string>
286286
<string name="subtitle_onrampSuccess">Your cash is on the way and should arrive in a few minutes</string>
287287
<string name="subtitle_contactSupportOnRamp">If you have any issues receiving you funds please contact us at support@flipcash.com</string>
288+
289+
<string name="error_title_phantomDecryption">Something went wrong</string>
290+
<string name="error_title_phantomDeserialization">Something went wrong</string>
291+
<string name="error_title_phantomFailedToCreateTransaction">Something went wrong</string>
292+
<string name="error_title_phantomFailedToCreateDeeplink">Something went wrong</string>
293+
<string name="error_title_phantomFailedToSendTransaction">Something went wrong</string>
294+
<string name="error_title_phantomDisconnected">Something went wrong</string>
295+
<string name="error_title_phantomUnauthorized">Something went wrong</string>
296+
<string name="error_title_phantomUserRejected">Something went wrong</string>
297+
<string name="error_title_phantomInvalidInput">Something went wrong</string>
298+
<string name="error_title_phantomRequestedResourceNotAvailable">Something went wrong</string>
299+
<string name="error_title_phantomTransactionRejected">Something went wrong</string>
300+
<string name="error_title_phantomMethodNotFound">Something went wrong</string>
301+
<string name="error_title_phantomInternalError">Something went wrong</string>
302+
<string name="error_title_phantomUnknown">Something went wrong</string>
303+
304+
<string name="error_description_phantomDecryption">Failed to decrypt the response from Phantom. Please try again</string>
305+
<string name="error_description_phantomDeserialization">Failed to decrypt the response from Phantom. Please try again</string>
306+
<string name="error_description_phantomFailedToCreateTransaction">Failed to create a transaction to send to Phantom. Please try again</string>
307+
<string name="error_description_phantomFailedToCreateDeeplink">Failed to generate a deeplink to send to Phantom. Please try again</string>
308+
<string name="error_description_phantomFailedToSendTransaction">Transaction failed. Please try again</string>
309+
<string name="error_description_phantomDisconnected">Phantom could not connect to the network. Please try again</string>
310+
<string name="error_description_phantomUnauthorized">The request has not been authorized by the user.</string>
311+
<string name="error_description_phantomUserRejected">The user rejected the request.</string>
312+
<string name="error_description_phantomInvalidInput">Request was invalid. Please try again</string>
313+
<string name="error_description_phantomRequestedResourceNotAvailable">The requested resource is not available. This can occur if a previous confirmation modal was not closed in Phantom before requesting a new approval</string>
314+
<string name="error_description_phantomTransactionRejected">The transaction sent to Phantom was invalid</string>
315+
<string name="error_description_phantomMethodNotFound">Phantom did not recognize the request.</string>
316+
<string name="error_description_phantomInternalError">Something went wrong within Phantom. Please try again</string>
317+
<string name="error_description_phantomUnknown">Please try again</string>
288318
</resources>

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,13 @@ class BalanceScreen: ModalScreen, NamedScreen, Parcelable {
8080

8181
LaunchedEffect(viewModel) {
8282
viewModel.eventFlow
83-
.filterIsInstance<BalanceViewModel.Event.OpenDeposit>()
83+
.filterIsInstance<BalanceViewModel.Event.OpenAddFunds>()
8484
.onEach {
8585
navigator.push(
8686
ScreenRegistry.get(
87-
NavScreenProvider.HomeScreen.Menu.Transfers.Learn(TransferDirection.Incoming)
87+
NavScreenProvider.HomeScreen.OnRamp.ProviderList(
88+
NavScreenProvider.HomeScreen.Balance
89+
)
8890
)
8991
)
9092
}.launchIn(this)

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

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.navigationBars
1111
import androidx.compose.foundation.layout.padding
1212
import androidx.compose.foundation.layout.windowInsetsPadding
1313
import androidx.compose.foundation.lazy.LazyColumn
14-
import androidx.compose.foundation.lazy.itemsIndexed
1514
import androidx.compose.foundation.lazy.rememberLazyListState
1615
import androidx.compose.material.Divider
1716
import androidx.compose.material.Text
@@ -30,16 +29,11 @@ import androidx.paging.PagingData
3029
import androidx.paging.compose.LazyPagingItems
3130
import androidx.paging.compose.collectAsLazyPagingItems
3231
import androidx.paging.compose.itemKey
33-
import cafe.adriel.voyager.core.registry.ScreenRegistry
3432
import com.flipcash.app.balance.internal.components.BalanceHeader
3533
import com.flipcash.app.balance.internal.components.FeedItem
36-
import com.flipcash.app.core.NavScreenProvider
3734
import com.flipcash.app.core.feed.ActivityFeedMessage
38-
import com.flipcash.app.core.money.CurrencySelectionKind
39-
import com.flipcash.app.core.transfers.TransferDirection
4035
import com.flipcash.app.theme.FlipcashDesignSystem
4136
import com.flipcash.features.balance.R
42-
import com.getcode.navigation.core.LocalCodeNavigator
4337
import com.getcode.opencode.compose.ExchangeStub
4438
import com.getcode.opencode.compose.LocalExchange
4539
import com.getcode.opencode.model.financial.CurrencyCode
@@ -51,7 +45,6 @@ import com.getcode.ui.core.verticalScrollStateGradient
5145
import com.getcode.ui.theme.ButtonState
5246
import com.getcode.ui.theme.CodeButton
5347
import kotlinx.coroutines.flow.flowOf
54-
import kotlin.collections.emptyList
5548

5649
@Composable
5750
internal fun BalanceScreen(viewModel: BalanceViewModel) {
@@ -116,20 +109,12 @@ private fun FeedList(
116109
modifier = Modifier.fillMaxWidth().padding(horizontal = CodeTheme.dimens.inset),
117110
verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x12)
118111
) {
119-
Text(
120-
modifier = Modifier.fillMaxWidth(),
121-
text = stringResource(R.string.subtitle_balanceEmptyState),
122-
style = CodeTheme.typography.textMedium,
123-
color = CodeTheme.colors.textMain,
124-
textAlign = TextAlign.Center,
125-
)
126-
127112
CodeButton(
128113
modifier = Modifier.fillMaxWidth(),
129-
text = stringResource(R.string.action_depositFunds),
114+
text = stringResource(R.string.action_addCashToWallet),
130115
buttonState = ButtonState.Filled
131116
) {
132-
dispatchEvent(BalanceViewModel.Event.OpenDeposit)
117+
dispatchEvent(BalanceViewModel.Event.OpenAddFunds)
133118
}
134119
}
135120
}

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.flipcash.app.core.extensions.onResult
77
import com.flipcash.app.core.feed.ActivityFeedMessage
88
import com.flipcash.app.core.feed.MessageMetadata
99
import com.flipcash.app.core.money.formatted
10-
import com.flipcash.app.core.ui.CurrencyHolder
1110
import com.flipcash.app.featureflags.FeatureFlag
1211
import com.flipcash.app.featureflags.FeatureFlagController
1312
import com.flipcash.features.balance.R
@@ -18,7 +17,6 @@ import com.getcode.opencode.controllers.BalanceController
1817
import com.getcode.opencode.controllers.TransactionController
1918
import com.getcode.opencode.exchange.Exchange
2019
import com.getcode.opencode.model.core.ID
21-
import com.getcode.opencode.model.financial.Currency
2220
import com.getcode.opencode.model.financial.LocalFiat
2321
import com.getcode.solana.keys.PublicKey
2422
import com.getcode.util.resources.ResourceHelper
@@ -61,7 +59,7 @@ internal class BalanceViewModel @Inject constructor(
6159
data class CancelTransfer(val vault: PublicKey) : Event
6260

6361
data object OpenCurrencySelection : Event
64-
data object OpenDeposit : Event
62+
data object OpenAddFunds : Event
6563
}
6664

6765
init {
@@ -156,7 +154,7 @@ internal class BalanceViewModel @Inject constructor(
156154
val updateStateForEvent: (Event) -> ((State) -> State) = { event ->
157155
when (event) {
158156
Event.OpenCurrencySelection -> { state -> state }
159-
Event.OpenDeposit -> { state -> state }
157+
Event.OpenAddFunds -> { state -> state }
160158
Event.ResetSelections -> { state -> state }
161159
is Event.OnCancelRequested -> { state -> state }
162160
is Event.CancelTransfer -> { state -> state }

apps/flipcash/features/scanner/src/main/kotlin/com/flipcash/app/scanner/internal/ScannerDeepLinkHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ internal fun ScannerDeeplinkHandler(
7373
is PhantomDeeplinkOrigin.PoolWithId -> buildScreens(NavScreenProvider.HomeScreen.Pools.ChoiceSelection(poolId = origin.id))
7474
is PhantomDeeplinkOrigin.PoolWithRendezvous -> buildScreens(NavScreenProvider.HomeScreen.Pools.ChoiceSelection(rendezvous = origin.keyPair))
7575
PhantomDeeplinkOrigin.Cash -> buildScreens(NavScreenProvider.HomeScreen.Cash)
76+
PhantomDeeplinkOrigin.Balance -> buildScreens(NavScreenProvider.HomeScreen.Balance)
7677
}
7778

7879
navigator.show(screens)
@@ -84,6 +85,7 @@ internal fun ScannerDeeplinkHandler(
8485
is PhantomDeeplinkOrigin.PoolWithId -> buildScreens(NavScreenProvider.HomeScreen.Pools.ChoiceSelection(poolId = origin.id))
8586
is PhantomDeeplinkOrigin.PoolWithRendezvous -> buildScreens(NavScreenProvider.HomeScreen.Pools.ChoiceSelection(rendezvous = origin.keyPair))
8687
PhantomDeeplinkOrigin.Cash -> buildScreens(NavScreenProvider.HomeScreen.Cash)
88+
PhantomDeeplinkOrigin.Balance -> buildScreens(NavScreenProvider.HomeScreen.Balance)
8789
} + ScreenRegistry.get(NavScreenProvider.HomeScreen.OnRamp.Amount)
8890

8991
navigator.show(screens)

apps/flipcash/shared/phantom-onramp/src/main/kotlin/com/flipcash/app/onramp/PhantomOnRampHandler.kt

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.flipcash.app.onramp
22

3+
import android.content.Context
34
import androidx.compose.runtime.Composable
45
import androidx.compose.runtime.LaunchedEffect
6+
import androidx.compose.ui.platform.LocalContext
57
import androidx.compose.ui.platform.LocalUriHandler
68
import androidx.lifecycle.Lifecycle
79
import cafe.adriel.voyager.core.registry.ScreenRegistry
@@ -12,6 +14,7 @@ import com.flipcash.app.onramp.internal.PhantomDepositState
1214
import com.flipcash.app.onramp.internal.buildConnectDeeplink
1315
import com.flipcash.app.onramp.internal.buildTransactionDeeplink
1416
import com.flipcash.app.router.Router
17+
import com.flipcash.shared.onramp.phantom.R
1518
import com.getcode.manager.BottomBarManager
1619
import com.getcode.navigation.core.LocalCodeNavigator
1720
import com.getcode.ui.utils.RepeatOnLifecycle
@@ -42,26 +45,28 @@ fun PhantomOnRampHandler(
4245
}
4346

4447
val uriHandler = LocalUriHandler.current
48+
val context = LocalContext.current
4549
RepeatOnLifecycle(
4650
targetState = Lifecycle.State.STARTED
4751
) {
4852
state.errors
4953
.onEach { error ->
50-
// val (title, message) = error.messaging()
54+
val (title, message) = error.messaging(context)
5155
trace(
5256
tag = TAG,
5357
message = "Something went wrong during phantom onramp",
5458
type = TraceType.Error,
5559
metadata = {
5660
"errorMessage" to error.message
57-
"userMessage" to ""
61+
"userMessage" to message
5862
"code" to error.code
59-
}
63+
},
64+
error = error
6065
)
6166

6267
BottomBarManager.showError(
63-
"Something went wrong",
64-
"Please try again"
68+
title = title,
69+
message = message,
6570
) {
6671
launch { close() }
6772
state.reset()
@@ -177,21 +182,24 @@ fun PhantomOnRampHandler(
177182

178183
private const val TAG = "onramp::phantom"
179184

180-
private fun PhantomOnRampError.messaging(): Pair<String, String> = when (this) {
181-
is PhantomOnRampError.DecryptionError -> TODO()
182-
is PhantomOnRampError.DeserializationError -> TODO()
183-
is PhantomOnRampError.FailedToCreateTransaction -> TODO()
184-
is PhantomOnRampError.FailedToGenerateDeeplink -> TODO()
185-
is PhantomOnRampError.FailedToSendTransaction -> TODO()
185+
private typealias Title = String
186+
private typealias Message = String
187+
188+
private fun PhantomOnRampError.messaging(context: Context): Pair<Title, Message> = when (this) {
189+
is PhantomOnRampError.DecryptionError -> context.getString(R.string.error_title_phantomDecryption) to context.getString(R.string.error_description_phantomDecryption)
190+
is PhantomOnRampError.DeserializationError -> context.getString(R.string.error_title_phantomDeserialization) to context.getString(R.string.error_description_phantomDeserialization)
191+
is PhantomOnRampError.FailedToCreateTransaction -> context.getString(R.string.error_title_phantomFailedToCreateTransaction) to context.getString(R.string.error_description_phantomFailedToCreateTransaction)
192+
is PhantomOnRampError.FailedToGenerateDeeplink -> context.getString(R.string.error_title_phantomFailedToCreateDeeplink) to context.getString(R.string.error_description_phantomFailedToCreateDeeplink)
193+
is PhantomOnRampError.FailedToSendTransaction -> context.getString(R.string.error_title_phantomFailedToSendTransaction) to context.getString(R.string.error_description_phantomFailedToSendTransaction)
186194
is PhantomOnRampError.PhantomProvidedError -> when (this.error) {
187-
PhantomError.Disconnected -> TODO()
188-
PhantomError.Unauthorized -> TODO()
189-
PhantomError.UserRejectedRequest -> TODO()
190-
PhantomError.InvalidInput -> TODO()
191-
PhantomError.RequestedResourceNotAvailable -> TODO()
192-
PhantomError.TransactionRejected -> TODO()
193-
PhantomError.MethodNotFound -> TODO()
194-
PhantomError.InternalError -> TODO()
195-
PhantomError.Unknown -> "Something went wrong" to "Please try again"
195+
PhantomError.Disconnected -> context.getString(R.string.error_title_phantomDisconnected) to context.getString(R.string.error_description_phantomDisconnected)
196+
PhantomError.Unauthorized -> context.getString(R.string.error_title_phantomUnauthorized) to context.getString(R.string.error_description_phantomUnauthorized)
197+
PhantomError.UserRejectedRequest -> context.getString(R.string.error_title_phantomUserRejected) to context.getString(R.string.error_description_phantomUserRejected)
198+
PhantomError.InvalidInput -> context.getString(R.string.error_title_phantomInvalidInput) to context.getString(R.string.error_description_phantomInvalidInput)
199+
PhantomError.RequestedResourceNotAvailable -> context.getString(R.string.error_title_phantomRequestedResourceNotAvailable) to context.getString(R.string.error_description_phantomRequestedResourceNotAvailable)
200+
PhantomError.TransactionRejected -> context.getString(R.string.error_title_phantomTransactionRejected) to context.getString(R.string.error_description_phantomTransactionRejected)
201+
PhantomError.MethodNotFound -> context.getString(R.string.error_title_phantomMethodNotFound) to context.getString(R.string.error_description_phantomMethodNotFound)
202+
PhantomError.InternalError -> context.getString(R.string.error_title_phantomInternalError) to context.getString(R.string.error_description_phantomInternalError)
203+
PhantomError.Unknown -> context.getString(R.string.error_title_phantomUnknown) to context.getString(R.string.error_description_phantomUnknown)
196204
}
197205
}

apps/flipcash/shared/phantom-onramp/src/main/kotlin/com/flipcash/app/onramp/internal/PhantomDepositState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class PhantomDepositState(
241241
}
242242

243243
/**
244-
* Reset the state of the onamp flow
244+
* Reset the state of the onramp flow
245245
*/
246246
fun reset() {
247247
deeplinkState = PhantomDeeplinkState.IDLE

0 commit comments

Comments
 (0)