Updated on 2026-08-14
This commit is contained in:
parent
a3e92038c7
commit
46eee92cea
27 changed files with 218 additions and 7 deletions
|
|
@ -2,6 +2,7 @@ package com.tangem.features.onramp.confirmresidency.model
|
|||
|
||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ComponentScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -9,6 +10,7 @@ import com.tangem.core.decompose.navigation.Router
|
|||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.domain.onramp.GetOnrampCountryUseCase
|
||||
import com.tangem.domain.onramp.OnrampSaveDefaultCountryUseCase
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.features.onramp.confirmresidency.ConfirmResidencyComponent
|
||||
import com.tangem.features.onramp.confirmresidency.entity.ConfirmResidencyBottomSheetConfig
|
||||
import com.tangem.features.onramp.confirmresidency.entity.ConfirmResidencyUM
|
||||
|
|
@ -23,6 +25,7 @@ import javax.inject.Inject
|
|||
@ComponentScoped
|
||||
internal class ConfirmResidencyModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val router: Router,
|
||||
private val saveDefaultCountryUseCase: OnrampSaveDefaultCountryUseCase,
|
||||
getOnrampCountryUseCase: GetOnrampCountryUseCase,
|
||||
|
|
@ -45,6 +48,7 @@ internal class ConfirmResidencyModel @Inject constructor(
|
|||
)
|
||||
|
||||
init {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.ResidenceConfirmScreenOpened(params.country.name))
|
||||
getOnrampCountryUseCase.invoke()
|
||||
.onEach { maybeCountry ->
|
||||
val country = maybeCountry.getOrNull()
|
||||
|
|
@ -58,18 +62,23 @@ internal class ConfirmResidencyModel @Inject constructor(
|
|||
private fun getPrimaryButtonConfig() = if (params.country.onrampAvailable) {
|
||||
ConfirmResidencyUM.ActionButtonConfig(
|
||||
onClick = {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceConfirm(params.country.name))
|
||||
modelScope.launch { saveDefaultCountryUseCase.invoke(params.country) }
|
||||
},
|
||||
text = resourceReference(R.string.common_confirm),
|
||||
)
|
||||
} else {
|
||||
ConfirmResidencyUM.ActionButtonConfig(
|
||||
onClick = router::pop,
|
||||
onClick = {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.CloseOnramp)
|
||||
router.pop()
|
||||
},
|
||||
text = resourceReference(R.string.common_close),
|
||||
)
|
||||
}
|
||||
|
||||
private fun onChangeClick() {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceChange)
|
||||
bottomSheetNavigation.activate(ConfirmResidencyBottomSheetConfig.SelectCountry)
|
||||
}
|
||||
}
|
||||
|
|
@ -24,7 +24,7 @@ import dagger.assisted.AssistedInject
|
|||
|
||||
internal class DefaultOnrampMainComponent @AssistedInject constructor(
|
||||
@Assisted appComponentContext: AppComponentContext,
|
||||
@Assisted params: OnrampMainComponent.Params,
|
||||
@Assisted private val params: OnrampMainComponent.Params,
|
||||
private val confirmResidencyComponentFactory: ConfirmResidencyComponent.Factory,
|
||||
private val selectCurrencyComponentFactory: SelectCurrencyComponent.Factory,
|
||||
private val selectProviderComponentFactory: SelectProviderComponent.Factory,
|
||||
|
|
@ -68,6 +68,7 @@ internal class DefaultOnrampMainComponent @AssistedInject constructor(
|
|||
onProviderClick = model::onProviderSelected,
|
||||
onDismiss = model.bottomSheetNavigation::dismiss,
|
||||
selectedPaymentMethod = config.selectedPaymentMethod,
|
||||
cryptoCurrency = params.cryptoCurrency,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,12 +3,14 @@ package com.tangem.features.onramp.main
|
|||
import com.tangem.core.decompose.factory.ComponentFactory
|
||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
||||
import com.tangem.domain.onramp.model.OnrampSource
|
||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||
|
||||
internal interface OnrampMainComponent : ComposableContentComponent {
|
||||
|
||||
data class Params(
|
||||
val cryptoCurrency: CryptoCurrency,
|
||||
val source: OnrampSource,
|
||||
val openSettings: () -> Unit,
|
||||
val openRedirectPage: (quote: OnrampProviderWithQuote.Data) -> Unit,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -2,10 +2,12 @@ package com.tangem.features.onramp.main.model
|
|||
|
||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
import com.tangem.core.decompose.navigation.Router
|
||||
import com.tangem.domain.onramp.*
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.domain.onramp.model.OnrampAvailability
|
||||
import com.tangem.domain.onramp.model.OnrampCurrency
|
||||
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
||||
|
|
@ -27,6 +29,7 @@ import javax.inject.Inject
|
|||
@Suppress("LongParameterList")
|
||||
internal class OnrampMainComponentModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val router: Router,
|
||||
private val checkOnrampAvailabilityUseCase: CheckOnrampAvailabilityUseCase,
|
||||
private val getOnrampCurrencyUseCase: GetOnrampCurrencyUseCase,
|
||||
|
|
@ -58,10 +61,20 @@ internal class OnrampMainComponentModel @Inject constructor(
|
|||
val bottomSheetNavigation: SlotNavigation<OnrampMainBottomSheetConfig> = SlotNavigation()
|
||||
|
||||
init {
|
||||
sendScreenOpenAnalytics()
|
||||
checkResidenceCountry()
|
||||
subscribeToAmountChanges()
|
||||
}
|
||||
|
||||
private fun sendScreenOpenAnalytics() {
|
||||
analyticsEventHandler.send(
|
||||
OnrampAnalyticsEvent.ScreenOpened(
|
||||
source = params.source,
|
||||
cryptoCurrency = params.cryptoCurrency.name,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fun onProviderSelected(providerWithQuote: OnrampProviderWithQuote.Data) {
|
||||
_state.update { amountStateFactory.getAmountSecondaryUpdatedState(providerWithQuote) }
|
||||
}
|
||||
|
|
@ -132,10 +145,19 @@ internal class OnrampMainComponentModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onBuyClick(quote: OnrampProviderWithQuote.Data) {
|
||||
val currentContentState = state.value as? OnrampMainComponentUM.Content ?: return
|
||||
analyticsEventHandler.send(
|
||||
OnrampAnalyticsEvent.OnBuyClick(
|
||||
providerName = quote.provider.info.name,
|
||||
currency = currentContentState.amountBlockState.currencyUM.code,
|
||||
cryptoCurrency = params.cryptoCurrency.name,
|
||||
),
|
||||
)
|
||||
params.openRedirectPage(quote)
|
||||
}
|
||||
|
||||
override fun openCurrenciesList() {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectCurrencyScreenOpened)
|
||||
bottomSheetNavigation.activate(OnrampMainBottomSheetConfig.CurrenciesList)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import com.tangem.core.decompose.factory.ComponentFactory
|
|||
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
|
||||
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
||||
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||
|
||||
internal interface SelectProviderComponent : ComposableBottomSheetComponent {
|
||||
|
||||
|
|
@ -11,6 +12,7 @@ internal interface SelectProviderComponent : ComposableBottomSheetComponent {
|
|||
val onProviderClick: (OnrampProviderWithQuote.Data) -> Unit,
|
||||
val onDismiss: () -> Unit,
|
||||
val selectedPaymentMethod: OnrampPaymentMethod,
|
||||
val cryptoCurrency: CryptoCurrency,
|
||||
)
|
||||
|
||||
interface Factory : ComponentFactory<Params, SelectProviderComponent>
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.tangem.features.onramp.providers.model
|
|||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.arkivanov.decompose.router.slot.dismiss
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ComponentScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -15,6 +16,7 @@ import com.tangem.domain.onramp.GetOnrampPaymentMethodsUseCase
|
|||
import com.tangem.domain.onramp.GetOnrampProviderWithQuoteUseCase
|
||||
import com.tangem.domain.onramp.GetOnrampSelectedPaymentMethodUseCase
|
||||
import com.tangem.domain.onramp.OnrampSaveSelectedPaymentMethod
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.domain.onramp.model.OnrampPaymentMethod
|
||||
import com.tangem.domain.onramp.model.OnrampProviderWithQuote
|
||||
import com.tangem.features.onramp.impl.R
|
||||
|
|
@ -31,9 +33,11 @@ import kotlinx.coroutines.launch
|
|||
import timber.log.Timber
|
||||
import javax.inject.Inject
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@ComponentScoped
|
||||
internal class SelectProviderModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val getSelectedPaymentMethodsUseCase: GetOnrampPaymentMethodsUseCase,
|
||||
private val getOnrampSelectedPaymentMethodUseCase: GetOnrampSelectedPaymentMethodUseCase,
|
||||
private val getOnrampProviderWithQuoteUseCase: GetOnrampProviderWithQuoteUseCase,
|
||||
|
|
@ -47,6 +51,7 @@ internal class SelectProviderModel @Inject constructor(
|
|||
private val _state = MutableStateFlow(getInitialState())
|
||||
|
||||
init {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.ProvidersScreenOpened)
|
||||
getProviders(params.selectedPaymentMethod)
|
||||
subscribeToPaymentMethodUpdates()
|
||||
}
|
||||
|
|
@ -80,6 +85,7 @@ internal class SelectProviderModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun openPaymentMethods() {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.PaymentMethodsScreenOpened)
|
||||
modelScope.launch {
|
||||
val methods = getSelectedPaymentMethodsUseCase.invoke().getOrNull().orEmpty()
|
||||
bottomSheetNavigation.activate(
|
||||
|
|
@ -101,6 +107,7 @@ internal class SelectProviderModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun onPaymentMethodSelected(paymentMethod: OnrampPaymentMethod) {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.OnPaymentMethodChosen)
|
||||
modelScope.launch {
|
||||
saveSelectedPaymentMethod.invoke(paymentMethod)
|
||||
_state.update { state ->
|
||||
|
|
@ -128,6 +135,12 @@ internal class SelectProviderModel @Inject constructor(
|
|||
rate = rate,
|
||||
isSelected = index == 0,
|
||||
onClick = {
|
||||
analyticsEventHandler.send(
|
||||
OnrampAnalyticsEvent.OnProviderChosen(
|
||||
providerName = quote.provider.info.name,
|
||||
cryptoCurrency = params.cryptoCurrency.name,
|
||||
),
|
||||
)
|
||||
params.onProviderClick(quote)
|
||||
params.onDismiss()
|
||||
},
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ internal class DefaultOnrampComponent @AssistedInject constructor(
|
|||
params = OnrampMainComponent.Params(
|
||||
cryptoCurrency = params.cryptoCurrency,
|
||||
openSettings = { navigation.push(OnrampChild.Settings) },
|
||||
source = params.source,
|
||||
openRedirectPage = {
|
||||
navigation.push(
|
||||
OnrampChild.RedirectPage(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.tangem.features.onramp.selectcountry.model
|
||||
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ComponentScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -8,6 +9,7 @@ import com.tangem.core.ui.extensions.resourceReference
|
|||
import com.tangem.domain.onramp.GetOnrampCountriesUseCase
|
||||
import com.tangem.domain.onramp.GetOnrampCountryUseCase
|
||||
import com.tangem.domain.onramp.OnrampSaveDefaultCountryUseCase
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.domain.onramp.model.OnrampCountry
|
||||
import com.tangem.features.onramp.impl.R
|
||||
import com.tangem.features.onramp.selectcountry.SelectCountryComponent
|
||||
|
|
@ -27,9 +29,11 @@ import kotlinx.coroutines.flow.*
|
|||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@ComponentScoped
|
||||
internal class OnrampSelectCountryModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val searchManager: InputManager,
|
||||
private val getOnrampCountriesUseCase: GetOnrampCountriesUseCase,
|
||||
private val saveDefaultCountryUseCase: OnrampSaveDefaultCountryUseCase,
|
||||
|
|
@ -46,6 +50,7 @@ internal class OnrampSelectCountryModel @Inject constructor(
|
|||
private val refreshTrigger = MutableSharedFlow<Unit>()
|
||||
|
||||
init {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.SelectResidenceOpened)
|
||||
modelScope.launch { subscribeOnUpdateState() }
|
||||
}
|
||||
|
||||
|
|
@ -73,6 +78,7 @@ internal class OnrampSelectCountryModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun saveCountry(country: OnrampCountry) {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.OnResidenceChosen(country.name))
|
||||
modelScope.launch {
|
||||
saveDefaultCountryUseCase.invoke(country)
|
||||
dismiss()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.tangem.features.onramp.selectcurrency.model
|
||||
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ComponentScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -8,6 +9,7 @@ import com.tangem.core.ui.extensions.resourceReference
|
|||
import com.tangem.core.ui.extensions.stringReference
|
||||
import com.tangem.domain.onramp.GetOnrampCurrenciesUseCase
|
||||
import com.tangem.domain.onramp.OnrampSaveDefaultCurrencyUseCase
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.domain.onramp.model.OnrampCurrency
|
||||
import com.tangem.features.onramp.impl.R
|
||||
import com.tangem.features.onramp.selectcurrency.SelectCurrencyComponent
|
||||
|
|
@ -31,6 +33,7 @@ import javax.inject.Inject
|
|||
@ComponentScoped
|
||||
internal class OnrampSelectCurrencyModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val searchManager: InputManager,
|
||||
private val getOnrampCurrenciesUseCase: GetOnrampCurrenciesUseCase,
|
||||
private val saveDefaultCurrencyUseCase: OnrampSaveDefaultCurrencyUseCase,
|
||||
|
|
@ -72,6 +75,7 @@ internal class OnrampSelectCurrencyModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun saveDefaultCurrency(currency: OnrampCurrency) {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.FiatCurrencyChosen(currency.code))
|
||||
modelScope.launch {
|
||||
saveDefaultCurrencyUseCase.invoke(currency)
|
||||
dismiss()
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import com.tangem.core.ui.message.ContentMessage
|
|||
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
|
||||
import com.tangem.domain.appcurrency.model.AppCurrency
|
||||
import com.tangem.domain.demo.IsDemoCardUseCase
|
||||
import com.tangem.domain.onramp.model.OnrampSource
|
||||
import com.tangem.domain.redux.ReduxStateHolder
|
||||
import com.tangem.domain.tokens.legacy.TradeCryptoAction
|
||||
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
|
||||
|
|
@ -118,6 +119,7 @@ internal class OnrampOperationModel @Inject constructor(
|
|||
return TradeCryptoAction.Buy(
|
||||
userWallet = selectedUserWallet,
|
||||
cryptoCurrencyStatus = status,
|
||||
source = OnrampSource.ACTION_BUTTONS,
|
||||
appCurrencyCode = appCurrencyCode,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,10 +3,12 @@ package com.tangem.features.onramp.settings.model
|
|||
import arrow.core.Either
|
||||
import com.arkivanov.decompose.router.slot.SlotNavigation
|
||||
import com.arkivanov.decompose.router.slot.activate
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ComponentScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
import com.tangem.domain.onramp.GetOnrampCountryUseCase
|
||||
import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent
|
||||
import com.tangem.domain.onramp.model.OnrampCountry
|
||||
import com.tangem.features.onramp.settings.OnrampSettingsComponent
|
||||
import com.tangem.features.onramp.settings.entity.OnrampSettingsConfig
|
||||
|
|
@ -20,6 +22,7 @@ import javax.inject.Inject
|
|||
@ComponentScoped
|
||||
internal class OnrampSettingsModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val getOnrampCountryUseCase: GetOnrampCountryUseCase,
|
||||
paramsContainer: ParamsContainer,
|
||||
) : Model() {
|
||||
|
|
@ -31,6 +34,7 @@ internal class OnrampSettingsModel @Inject constructor(
|
|||
private val _state: MutableStateFlow<OnrampSettingsUM> = MutableStateFlow(getInitialState())
|
||||
|
||||
init {
|
||||
analyticsEventHandler.send(OnrampAnalyticsEvent.SettingsOpened)
|
||||
subscribeOnUpdateState()
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue