Skip to content

Commit 46f3071

Browse files
committed
chore(flipcash): utilize preferred onramp provider to drive flow between quick add vs full flow
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent 45d397d commit 46f3071

File tree

4 files changed

+45
-36
lines changed

4 files changed

+45
-36
lines changed

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ internal class BalanceViewModel @Inject constructor(
5959
data class State(
6060
val balance: LocalFiat? = null,
6161
val canViewDetails: Boolean = false,
62-
val onrampProviders: List<OnRampProvider> = emptyList(),
62+
val preferredOnRampProvider: OnRampProvider? = null,
6363
val expandedItem: ID? = null,
6464
)
6565

6666
sealed interface Event {
6767
data class OnBalanceUpdated(val balance: LocalFiat) : Event
6868
data class OnTransactionDetailsEnabled(val enabled: Boolean) : Event
69-
data class OnOnRampProvidersChanged(val providers: List<OnRampProvider>) : Event
69+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?) : Event
7070
data class ViewDetails(val id: ID?) : Event
7171
data object ResetSelections : Event
7272
data class OnCancelRequested(val message: ActivityFeedMessage) : Event
@@ -167,18 +167,18 @@ internal class BalanceViewModel @Inject constructor(
167167
userManager.state
168168
.filter { it.authState is AuthState.LoggedInWithUser }
169169
.mapNotNull { it.flags }
170-
.map { it.supportedOnRampProviders }
171-
.onEach { providers ->
172-
dispatchEvent(Event.OnOnRampProvidersChanged(providers))
170+
.map { it.preferredOnRampProvider }
171+
.onEach { provider ->
172+
dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider))
173173
}
174174
.launchIn(viewModelScope)
175175

176176
eventFlow
177177
.filterIsInstance<Event.OnAddCashClicked>()
178178
.onEach {
179-
val providers = stateFlow.value.onrampProviders
180-
if (providers.any { it is OnRampProvider.Coinbase }) {
181-
// has coinbase provider - pop selection for quick add
179+
val provider = stateFlow.value.preferredOnRampProvider
180+
if (provider is OnRampProvider.Coinbase && provider.type == OnRampType.Virtual) {
181+
// has coinbase provider supporting google pay - pop selection for quick add
182182
dispatchEvent(Event.OpenOnRampAmountModal)
183183
} else {
184184
// route to provider list
@@ -222,8 +222,8 @@ internal class BalanceViewModel @Inject constructor(
222222
val updateStateForEvent: (Event) -> ((State) -> State) = { event ->
223223
when (event) {
224224
Event.OpenCurrencySelection -> { state -> state }
225-
is Event.OnOnRampProvidersChanged -> { state ->
226-
state.copy(onrampProviders = event.providers)
225+
is Event.OnPreferredOnRampProviderChanged -> { state ->
226+
state.copy(preferredOnRampProvider = event.provider)
227227
}
228228

229229
Event.OnAddCashClicked -> { state -> state }

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ internal class CashScreenViewModel @Inject constructor(
6464
val limits: Limits? = null,
6565
val maxForGive: Pair<Double, CurrencyCode>? = null,
6666
val generatingBill: LoadingSuccessState = LoadingSuccessState(),
67-
val onrampProviders: List<OnRampProvider> = emptyList(),
68-
) {
67+
val preferredOnRampProvider: OnRampProvider? = null,
68+
) {
6969
val canGive: Boolean
7070
get() = (amountAnimatedModel.amountData.amount.toDoubleOrNull() ?: 0.0) > 0.00
7171

@@ -101,7 +101,7 @@ internal class CashScreenViewModel @Inject constructor(
101101
data object OnGive : Event
102102
data class PresentBill(val bill: Bill.Cash) : Event
103103

104-
data class OnOnRampProvidersChanged(val providers: List<OnRampProvider>): Event
104+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?) : Event
105105

106106
data class AddCashToWallet(val amount: Fiat) : Event
107107
data class OpenOnRampAmountModal(val amount: Fiat) : Event
@@ -113,7 +113,9 @@ internal class CashScreenViewModel @Inject constructor(
113113

114114
val checkBalanceLimit: () -> Boolean = {
115115
val amount = stateFlow.value.amountAnimatedModel.amountData.amount.toDoubleOrNull() ?: 0.0
116-
val conversionRate = exchange.rateToUsd(stateFlow.value.currencyModel.code ?: CurrencyCode.USD) ?: Rate.ignore
116+
val conversionRate =
117+
exchange.rateToUsd(stateFlow.value.currencyModel.code ?: CurrencyCode.USD)
118+
?: Rate.ignore
117119
val enteredInUsdc = Fiat(
118120
fiat = amount,
119121
currencyCode = stateFlow.value.currencyModel.code ?: CurrencyCode.USD
@@ -300,13 +302,20 @@ internal class CashScreenViewModel @Inject constructor(
300302
.filterIsInstance<Event.AddCashToWallet>()
301303
.map { it.amount }
302304
.onEach { amount ->
303-
val providers = stateFlow.value.onrampProviders
304-
if (providers.any { it is OnRampProvider.Coinbase }) {
305-
// has coinbase provider - pop selection for quick add
305+
val provider = stateFlow.value.preferredOnRampProvider
306+
if (provider is OnRampProvider.Coinbase && provider.type == OnRampType.Virtual) {
307+
// has coinbase provider supporting google pay - pop selection for quick add
306308
dispatchEvent(Event.OpenOnRampAmountModal(amount))
307309
} else {
308310
// route to provider list
309-
dispatchEvent(Event.OpenScreen(AppRoute.OnRamp.ProviderList(AppRoute.Sheets.Cash, amount)))
311+
dispatchEvent(
312+
Event.OpenScreen(
313+
AppRoute.OnRamp.ProviderList(
314+
AppRoute.Sheets.Cash,
315+
amount
316+
)
317+
)
318+
)
310319
}
311320
}.launchIn(viewModelScope)
312321

@@ -342,8 +351,8 @@ internal class CashScreenViewModel @Inject constructor(
342351
)
343352
}
344353

345-
is Event.OnOnRampProvidersChanged -> { state ->
346-
state.copy(onrampProviders = event.providers)
354+
is Event.OnPreferredOnRampProviderChanged -> { state ->
355+
state.copy(preferredOnRampProvider = event.provider)
347356
}
348357

349358
is Event.OpenOnRampAmountModal -> { state -> state }

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.flipcash.app.core.android.VersionInfo
77
import com.flipcash.app.core.extensions.onResult
88
import com.flipcash.app.core.transfers.TransferDirection
99
import com.flipcash.app.featureflags.BetaFeature
10-
import com.flipcash.app.featureflags.FeatureFlag
1110
import com.flipcash.app.featureflags.FeatureFlagController
1211
import com.flipcash.app.menu.MenuItem
1312
import com.flipcash.app.onramp.ConfirmationEvent
@@ -63,7 +62,7 @@ internal class MenuScreenViewModel @Inject constructor(
6362
val items: List<MenuItem<Event>> = FullMenuList,
6463
val logoTapCount: Int = 0,
6564
val isStaff: Boolean = false,
66-
val onrampProviders: List<OnRampProvider> = emptyList(),
65+
val preferredOnRampProvider: OnRampProvider? = null,
6766
val flags: List<BetaFeature> = emptyList(),
6867
val unlockedBetaFeaturesManually: Boolean = false,
6968
val appVersionInfo: VersionInfo = VersionInfo(),
@@ -73,7 +72,7 @@ internal class MenuScreenViewModel @Inject constructor(
7372
data object OnLogoTapped: Event
7473
data class OnBetaFeaturesUnlocked(val unlocked: Boolean): Event
7574
data class OnFeatureFlagsUpdated(val flags: List<BetaFeature>): Event
76-
data class OnOnRampProvidersChanged(val providers: List<OnRampProvider>): Event
75+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?): Event
7776
data class OnAppVersionUpdated(val versionInfo: VersionInfo) : Event
7877
data class OnStaffUserDetermined(val staff: Boolean) : Event
7978
data class OpenScreen(val screen: AppRoute) : Event
@@ -109,9 +108,9 @@ internal class MenuScreenViewModel @Inject constructor(
109108
userManager.state
110109
.filter { it.authState is AuthState.LoggedInWithUser }
111110
.mapNotNull { it.flags }
112-
.map { it.supportedOnRampProviders }
113-
.onEach { providers ->
114-
dispatchEvent(Event.OnOnRampProvidersChanged(providers))
111+
.map { it.preferredOnRampProvider }
112+
.onEach { provider ->
113+
dispatchEvent(Event.OnPreferredOnRampProviderChanged(provider))
115114
}
116115
.launchIn(viewModelScope)
117116

@@ -126,9 +125,9 @@ internal class MenuScreenViewModel @Inject constructor(
126125
eventFlow
127126
.filterIsInstance<Event.OnAddCashClicked>()
128127
.onEach {
129-
val providers = stateFlow.value.onrampProviders
130-
if (providers.any { it is OnRampProvider.Coinbase }) {
131-
// has coinbase provider - pop selection for quick add
128+
val provider = stateFlow.value.preferredOnRampProvider
129+
if (provider is OnRampProvider.Coinbase && provider.type == OnRampType.Virtual) {
130+
// has coinbase provider supporting google pay - pop selection for quick add
132131
dispatchEvent(Event.OpenOnRampAmountModal)
133132
} else {
134133
// route to provider list
@@ -287,8 +286,8 @@ internal class MenuScreenViewModel @Inject constructor(
287286
Event.OnAddCashClicked -> { state -> state }
288287
Event.OnWithdrawClicked -> { state -> state }
289288
Event.OpenOnRampAmountModal -> { state -> state }
290-
is Event.OnOnRampProvidersChanged -> { state ->
291-
state.copy(onrampProviders = event.providers)
289+
is Event.OnPreferredOnRampProviderChanged -> { state ->
290+
state.copy(preferredOnRampProvider = event.provider)
292291
}
293292

294293
is Event.OnFeatureFlagsUpdated -> { state ->

apps/flipcash/features/pools/src/main/kotlin/com/flipcash/app/pools/internal/betting/PoolBettingViewModel.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ internal class PoolBettingViewModel @Inject constructor(
8888
val selectedOutcome: PoolBetOutcome? = null,
8989
val isDistributed: Boolean? = null,
9090
val bottomBarActions: List<BottomBarAction> = emptyList(),
91-
val onrampProviders: List<OnRampProvider> = emptyList(),
91+
val preferredOnRampProvider: OnRampProvider? = null,
9292
) {
9393
val isLoaded: Boolean
9494
get() = metadata != Pool.Empty
@@ -191,7 +191,7 @@ internal class PoolBettingViewModel @Inject constructor(
191191
data object OnSharePool : Event
192192
data object OnFailedToLoad: Event
193193
data class AddCashToWallet(val amount: Fiat): Event
194-
data class OnOnRampProvidersChanged(val providers: List<OnRampProvider>): Event
194+
data class OnPreferredOnRampProviderChanged(val provider: OnRampProvider?): Event
195195
data class OpenOnRampAmountModal(val amount: Fiat) : Event
196196
data class UpdateLoadingState(val loading: Boolean = false, val success: Boolean = false) : Event
197197
data class OpenScreen(val screen: AppRoute) : Event
@@ -622,8 +622,9 @@ internal class PoolBettingViewModel @Inject constructor(
622622
.filterIsInstance<Event.AddCashToWallet>()
623623
.map { it.amount }
624624
.onEach { amount ->
625-
val providers = stateFlow.value.onrampProviders
626-
if (providers.any { it is OnRampProvider.Coinbase }) {
625+
val provider = stateFlow.value.preferredOnRampProvider
626+
if (provider is OnRampProvider.Coinbase && provider.type == OnRampType.Virtual) {
627+
// has coinbase provider supporting google pay - pop selection for quick add
627628
// has coinbase provider - pop selection for quick add
628629
dispatchEvent(Event.OpenOnRampAmountModal(amount))
629630
} else {
@@ -732,7 +733,7 @@ internal class PoolBettingViewModel @Inject constructor(
732733

733734
is Event.OnDistributeFunds -> { state -> state }
734735
is Event.AddCashToWallet -> { state -> state }
735-
is Event.OnOnRampProvidersChanged -> { state -> state.copy(onrampProviders = event.providers) }
736+
is Event.OnPreferredOnRampProviderChanged -> { state -> state.copy(preferredOnRampProvider = event.provider) }
736737
is Event.OpenOnRampAmountModal -> { state -> state }
737738
is Event.UpdateLoadingState -> { state -> state }
738739
is Event.OpenScreen -> { state -> state }

0 commit comments

Comments
 (0)