From 5421e5eb698aed8f5a3cc0ff485b5aa205d1d3b9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 9 Jun 2026 14:24:45 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../onramp/alloffers/model/AllOffersModel.kt | 8 +++++ .../main/model/OnrampMainComponentModel.kt | 6 ++++ .../features/onramp/utils/OnrampDemoMode.kt | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/utils/OnrampDemoMode.kt diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt index 89dd1d8ecf..a5a43d679f 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/alloffers/model/AllOffersModel.kt @@ -3,6 +3,8 @@ package com.tangem.features.onramp.alloffers.model 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.ui.UiMessageSender +import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.onramp.GetOnrampAllOffersUseCase import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent import com.tangem.domain.onramp.model.OnrampProviderWithQuote @@ -13,6 +15,7 @@ import com.tangem.features.onramp.alloffers.entity.AllOffersPaymentMethodUM import com.tangem.features.onramp.alloffers.entity.AllOffersStateFactory import com.tangem.features.onramp.alloffers.entity.AllOffersStateUM import com.tangem.features.onramp.main.entity.OnrampOfferAdvantagesUM +import com.tangem.features.onramp.utils.showDemoModeWarningIfNeeded import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.Job @@ -24,10 +27,13 @@ import kotlinx.coroutines.launch import com.tangem.utils.logging.TangemLogger import javax.inject.Inject +@Suppress("LongParameterList") internal class AllOffersModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, private val analyticsEventHandler: AnalyticsEventHandler, private val getOnrampAllOffersUseCase: GetOnrampAllOffersUseCase, + private val isDemoCardUseCase: IsDemoCardUseCase, + private val messageSender: UiMessageSender, paramsContainer: ParamsContainer, ) : Model(), AllOffersIntents { @@ -92,6 +98,8 @@ internal class AllOffersModel @Inject constructor( analyticsEventHandler.send(event) } + if (messageSender.showDemoModeWarningIfNeeded(params.userWallet, isDemoCardUseCase)) return + dismiss() params.openRedirectPage(quote) } diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt index 58a8f7c652..86098da81b 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/main/model/OnrampMainComponentModel.kt @@ -6,7 +6,9 @@ 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.core.decompose.ui.UiMessageSender import com.tangem.core.ui.components.fields.InputManager +import com.tangem.domain.demo.IsDemoCardUseCase import com.tangem.domain.onramp.* import com.tangem.domain.onramp.analytics.OnrampAnalyticsEvent import com.tangem.domain.onramp.model.OnrampAvailability @@ -21,6 +23,7 @@ import com.tangem.features.onramp.main.entity.factory.OnrampAmountStateFactory import com.tangem.features.onramp.main.entity.factory.OnrampOffersStateFactory import com.tangem.features.onramp.main.entity.factory.OnrampStateFactory import com.tangem.features.onramp.utils.sendOnrampErrorEvent +import com.tangem.features.onramp.utils.showDemoModeWarningIfNeeded import com.tangem.utils.Provider import com.tangem.utils.coroutines.CoroutineDispatcherProvider import com.tangem.utils.coroutines.PeriodicTask @@ -45,6 +48,8 @@ internal class OnrampMainComponentModel @Inject constructor( private val fetchPairsUseCase: OnrampFetchPairsUseCase, private val amountInputManager: InputManager, private val getOnrampOffersUseCase: GetOnrampOffersUseCase, + private val isDemoCardUseCase: IsDemoCardUseCase, + private val messageSender: UiMessageSender, paramsContainer: ParamsContainer, getWalletsUseCase: GetWalletsUseCase, ) : Model(), OnrampIntents { @@ -146,6 +151,7 @@ internal class OnrampMainComponentModel @Inject constructor( onrampOfferAdvantagesUM = onrampOfferAdvantagesUM, categoryUM = categoryUM, ) + if (messageSender.showDemoModeWarningIfNeeded(userWallet, isDemoCardUseCase)) return params.openRedirectPage(quote) } diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/utils/OnrampDemoMode.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/utils/OnrampDemoMode.kt new file mode 100644 index 0000000000..578e478855 --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/utils/OnrampDemoMode.kt @@ -0,0 +1,30 @@ +package com.tangem.features.onramp.utils + +import com.tangem.core.decompose.ui.UiMessageSender +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.message.DialogMessage +import com.tangem.domain.demo.IsDemoCardUseCase +import com.tangem.domain.models.wallet.UserWallet +import com.tangem.features.onramp.impl.R + +/** + * Onramp (buy) is disabled for demo cards. When [userWallet] is a demo cold wallet, shows the + * demo-mode warning dialog and returns `true` — callers MUST abort the buy action in that case. + * + * Returns `false` for any non-demo wallet, so the caller can proceed. + */ +internal fun UiMessageSender.showDemoModeWarningIfNeeded( + userWallet: UserWallet, + isDemoCardUseCase: IsDemoCardUseCase, +): Boolean { + val isDemo = userWallet is UserWallet.Cold && isDemoCardUseCase(cardId = userWallet.cardId) + if (isDemo) { + send( + DialogMessage( + title = resourceReference(id = R.string.warning_demo_mode_title), + message = resourceReference(id = R.string.warning_demo_mode_message), + ), + ) + } + return isDemo +} \ No newline at end of file