11package com.flipcash.app.tokens
22
33import androidx.lifecycle.viewModelScope
4+ import com.flipcash.app.core.AppRoute
45import com.flipcash.app.core.tokens.TokenPurpose
6+ import com.flipcash.services.analytics.AnalyticsEvent
7+ import com.flipcash.services.analytics.FlipcashAnalyticsService
8+ import com.flipcash.services.internal.model.thirdparty.OnRampProvider
9+ import com.flipcash.services.internal.model.thirdparty.OnRampType
10+ import com.flipcash.services.user.AuthState
11+ import com.flipcash.services.user.UserManager
512import com.getcode.opencode.controllers.TokenController
613import com.getcode.opencode.exchange.Exchange
714import com.getcode.opencode.model.financial.Fiat
@@ -13,39 +20,59 @@ import com.getcode.opencode.model.financial.toFiat
1320import com.getcode.view.BaseViewModel2
1421import dagger.hilt.android.lifecycle.HiltViewModel
1522import kotlinx.coroutines.flow.combine
23+ import kotlinx.coroutines.flow.filter
1624import kotlinx.coroutines.flow.filterIsInstance
1725import kotlinx.coroutines.flow.flatMapLatest
1826import kotlinx.coroutines.flow.flowOf
1927import kotlinx.coroutines.flow.launchIn
2028import kotlinx.coroutines.flow.map
29+ import kotlinx.coroutines.flow.mapNotNull
2130import kotlinx.coroutines.flow.onEach
2231import javax.inject.Inject
2332
2433@HiltViewModel
2534class SelectTokenViewModel @Inject constructor(
35+ userManager : UserManager ,
2636 tokenController : TokenController ,
2737 exchange : Exchange ,
38+ analytics : FlipcashAnalyticsService ,
2839): BaseViewModel2<SelectTokenViewModel.State, SelectTokenViewModel.Event>(
2940 initialState = State (purpose = TokenPurpose .Balance ),
3041 updateStateForEvent = updateStateForEvent
3142) {
3243
3344 data class State (
3445 val purpose : TokenPurpose ,
46+ val preferredOnRampProvider : OnRampProvider ? = null ,
3547 val tokens : List <TokenWithLocalizedBalance >? = null ,
3648 ) {
3749 val totalBalance: LocalFiat
3850 get() = tokens.orEmpty().map { it.balance }.sum()
3951 }
4052
4153 sealed interface Event {
54+ data class OnPreferredOnRampProviderChanged (val provider : OnRampProvider ? ) : Event
55+
4256 data class OnPurposeChanged (val purpose : TokenPurpose ) : Event
4357 data class OnTokensUpdated (val tokens : List <TokenWithLocalizedBalance >) : Event
4458
4559 data class OnTokenSelected (val token : Token ): Event
60+
61+ data object OnAddCashClicked : Event
62+ data object OpenOnRampAmountModal : Event
63+ data class OpenScreen (val route : AppRoute ): Event
4664 }
4765
4866 init {
67+ userManager.state
68+ .filter { it.authState is AuthState .LoggedInWithUser }
69+ .mapNotNull { it.flags }
70+ .map { it.preferredOnRampProvider }
71+ .onEach { provider ->
72+ dispatchEvent(Event .OnPreferredOnRampProviderChanged (provider))
73+ }
74+ .launchIn(viewModelScope)
75+
4976 eventFlow
5077 .filterIsInstance<Event .OnPurposeChanged >()
5178 .map { it.purpose }
@@ -83,14 +110,34 @@ class SelectTokenViewModel @Inject constructor(
83110 }
84111 }.onEach { dispatchEvent(Event .OnTokensUpdated (it)) }
85112 .launchIn(viewModelScope)
113+
114+ eventFlow
115+ .filterIsInstance<Event .OnAddCashClicked >()
116+ .onEach {
117+ analytics.openOnramp(AnalyticsEvent .OnRampOpenEvent .Balance )
118+ val provider = stateFlow.value.preferredOnRampProvider
119+ if (provider is OnRampProvider .Coinbase && provider.type == OnRampType .Virtual ) {
120+ // has coinbase provider supporting google pay - pop selection for quick add
121+ dispatchEvent(Event .OpenOnRampAmountModal )
122+ } else {
123+ // route to provider list
124+ dispatchEvent(Event .OpenScreen (AppRoute .OnRamp .ProviderList (AppRoute .Sheets .Wallet )))
125+ }
126+ }.launchIn(viewModelScope)
86127 }
87128
88129 companion object {
89130 val updateStateForEvent: (Event ) -> ((State ) -> State ) = { event ->
90131 when (event) {
132+ is Event .OnPreferredOnRampProviderChanged -> { state ->
133+ state.copy(preferredOnRampProvider = event.provider)
134+ }
91135 is Event .OnPurposeChanged -> { state -> state.copy(purpose = event.purpose) }
92136 is Event .OnTokensUpdated -> { state -> state.copy(tokens = event.tokens) }
93137 is Event .OnTokenSelected -> { state -> state }
138+ is Event .OnAddCashClicked -> { state -> state }
139+ is Event .OpenOnRampAmountModal -> { state -> state }
140+ is Event .OpenScreen -> { state -> state }
94141 }
95142 }
96143 }
0 commit comments