From b1163d139354566809a1c1d93c0ca9c41b7f14d9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 9 Jul 2026 09:01:19 +0200 Subject: [PATCH] Updated on 2026-08-14 --- .../ActivateCampaignBottomSheetComponent.kt | 19 ++++++++++-- ...ignAlreadyActivatedBottomSheetComponent.kt | 18 +++++++++-- .../component/DefaultCampaignsComponent.kt | 31 ++++++++++--------- .../campaigns/model/ActivateCampaignsModel.kt | 15 +++------ .../model/CampaignAlreadyActivatedModel.kt | 14 ++------- 5 files changed, 55 insertions(+), 42 deletions(-) diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/ActivateCampaignBottomSheetComponent.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/ActivateCampaignBottomSheetComponent.kt index 7e8f99ece9..6137d3f58a 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/ActivateCampaignBottomSheetComponent.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/ActivateCampaignBottomSheetComponent.kt @@ -18,7 +18,11 @@ import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState import com.tangem.core.ui.ds2.button.Close import com.tangem.core.ui.ds2.button.TangemButton import com.tangem.core.ui.ds2.topnavigation.TangemTopNavigation +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.account.Account +import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.features.commonfeatures.api.choosetoken.ChooseTokenComponent +import com.tangem.features.promobanners.impl.campaigns.entity.CampaignType import com.tangem.features.promobanners.impl.campaigns.model.ActivateCampaignsModel import com.tangem.features.promobanners.impl.campaigns.ui.ActivateCampaignContent import com.tangem.features.promobanners.impl.campaigns.ui.ActivateCampaignFooter @@ -26,7 +30,8 @@ import com.tangem.features.promobanners.impl.campaigns.ui.ActivateCampaignFooter internal class ActivateCampaignBottomSheetComponent( appComponentContext: AppComponentContext, chooseTokenComponentFactory: ChooseTokenComponent.Factory, - private val params: ActivateCampaignsModel.Params, + private val params: Params, + val onDismiss: () -> Unit, ) : CampaignsModularComponent, AppComponentContext by appComponentContext { private val model: ActivateCampaignsModel = getOrCreateModel(params) @@ -41,7 +46,7 @@ internal class ActivateCampaignBottomSheetComponent( TangemTopNavigation( windowInsets = WindowInsets(0), blurBackground = false, - endButton = { TangemButton.Close(onClick = params.onDismiss) }, + endButton = { TangemButton.Close(onClick = onDismiss) }, ) } @@ -77,4 +82,14 @@ internal class ActivateCampaignBottomSheetComponent( content = { chooseTokenComponent.Content(modifier = Modifier.fillMaxWidth()) }, ) } + + data class Params( + val campaignType: CampaignType, + val modelCallbacks: ActivateCampaignModelCallbacks, + ) + + interface ActivateCampaignModelCallbacks { + val onActivated: (CampaignType) -> Unit + val onAlreadyActivated: (CampaignType, AppCurrency, Account?, CryptoCurrencyStatus) -> Unit + } } \ No newline at end of file diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/CampaignAlreadyActivatedBottomSheetComponent.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/CampaignAlreadyActivatedBottomSheetComponent.kt index 7a6becffa4..bbc6504059 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/CampaignAlreadyActivatedBottomSheetComponent.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/CampaignAlreadyActivatedBottomSheetComponent.kt @@ -16,13 +16,18 @@ import com.tangem.core.ui.ds2.button.Close import com.tangem.core.ui.ds2.button.TangemButton import com.tangem.core.ui.ds2.topnavigation.TangemTopNavigation import com.tangem.core.ui.extensions.stringResourceSafe +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.account.Account +import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.features.promobanners.impl.R +import com.tangem.features.promobanners.impl.campaigns.entity.CampaignType import com.tangem.features.promobanners.impl.campaigns.model.CampaignAlreadyActivatedModel import com.tangem.features.promobanners.impl.campaigns.ui.ActivateCampaignContent internal class CampaignAlreadyActivatedBottomSheetComponent( appComponentContext: AppComponentContext, - private val params: CampaignAlreadyActivatedModel.Params, + params: Params, + val onDismiss: () -> Unit, ) : CampaignsModularComponent, AppComponentContext by appComponentContext { private val model: CampaignAlreadyActivatedModel = getOrCreateModel(params) @@ -32,7 +37,7 @@ internal class CampaignAlreadyActivatedBottomSheetComponent( TangemTopNavigation( windowInsets = WindowInsets(0), blurBackground = false, - endButton = { TangemButton.Close(onClick = params.onDismiss) }, + endButton = { TangemButton.Close(onClick = onDismiss) }, ) } @@ -48,7 +53,14 @@ internal class CampaignAlreadyActivatedBottomSheetComponent( PrimaryButton( modifier = Modifier.fillMaxWidth(), text = stringResourceSafe(R.string.common_close), - onClick = params.onDismiss, + onClick = onDismiss, ) } + + data class Params( + val campaignType: CampaignType, + val account: Account?, + val appCurrency: AppCurrency, + val currency: CryptoCurrencyStatus, + ) } \ No newline at end of file diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/DefaultCampaignsComponent.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/DefaultCampaignsComponent.kt index 61ee9f8197..74c1e17c55 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/DefaultCampaignsComponent.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/component/DefaultCampaignsComponent.kt @@ -26,11 +26,14 @@ import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.state.BottomSheetState import com.tangem.core.ui.extensions.rememberLastNonNull +import com.tangem.domain.appcurrency.model.AppCurrency +import com.tangem.domain.models.account.Account +import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.features.commonfeatures.api.choosetoken.ChooseTokenComponent import com.tangem.features.promobanners.api.swapcashback.CampaignsComponent +import com.tangem.features.promobanners.impl.campaigns.component.ActivateCampaignBottomSheetComponent.ActivateCampaignModelCallbacks +import com.tangem.features.promobanners.impl.campaigns.entity.CampaignType import com.tangem.features.promobanners.impl.campaigns.entity.CampaignsBottomSheetConfig -import com.tangem.features.promobanners.impl.campaigns.model.ActivateCampaignsModel -import com.tangem.features.promobanners.impl.campaigns.model.CampaignAlreadyActivatedModel import com.tangem.features.promobanners.impl.campaigns.model.CampaignsModel import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -121,28 +124,28 @@ internal class DefaultCampaignsComponent @AssistedInject constructor( is CampaignsBottomSheetConfig.Activate -> ActivateCampaignBottomSheetComponent( appComponentContext = context, chooseTokenComponentFactory = chooseTokenComponentFactory, - params = ActivateCampaignsModel.Params( + onDismiss = model::onDismiss, + params = ActivateCampaignBottomSheetComponent.Params( campaignType = config.campaignType, - onDismiss = model::onDismiss, - onActivated = model::onActivated, - onAlreadyActivated = { campaignType, appCurrency, account, currency -> - model.onAlreadyActivated( - campaignType = campaignType, - appCurrency = appCurrency, - account = account, - currency = currency, - ) + modelCallbacks = object : ActivateCampaignModelCallbacks { + override val onActivated: (CampaignType) -> Unit = model::onActivated + override val onAlreadyActivated: ( + CampaignType, + AppCurrency, + Account?, + CryptoCurrencyStatus, + ) -> Unit = model::onAlreadyActivated }, ), ) is CampaignsBottomSheetConfig.AlreadyActivated -> CampaignAlreadyActivatedBottomSheetComponent( appComponentContext = context, - params = CampaignAlreadyActivatedModel.Params( + onDismiss = model::onDismiss, + params = CampaignAlreadyActivatedBottomSheetComponent.Params( campaignType = config.campaignType, appCurrency = config.appCurrency, account = config.account, currency = config.currency, - onDismiss = model::onDismiss, ), ) } diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/ActivateCampaignsModel.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/ActivateCampaignsModel.kt index fad53de9ca..25e8f6cb9f 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/ActivateCampaignsModel.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/ActivateCampaignsModel.kt @@ -19,8 +19,8 @@ import com.tangem.domain.models.currency.CryptoCurrencyStatus import com.tangem.features.commonfeatures.api.choosetoken.ChooseTokenBridge import com.tangem.features.commonfeatures.api.choosetoken.ChooseTokenResult import com.tangem.features.promobanners.impl.R +import com.tangem.features.promobanners.impl.campaigns.component.ActivateCampaignBottomSheetComponent import com.tangem.features.promobanners.impl.campaigns.entity.ActivateCampaignUM -import com.tangem.features.promobanners.impl.campaigns.entity.CampaignType import com.tangem.features.promobanners.impl.campaigns.entity.FooterUM import com.tangem.features.promobanners.impl.campaigns.entity.SelectedAccountUM import com.tangem.features.promobanners.impl.campaigns.entity.TermsUM @@ -45,7 +45,7 @@ internal class ActivateCampaignsModel @Inject constructor( private val urlOpener: UrlOpener, ) : Model() { - private val params = paramsContainer.require() + private val params = paramsContainer.require() private val accountIconConverter = AccountIconItemStateConverter(size = AccountIconSize.ExtraSmall) private var appCurrency: AppCurrency = AppCurrency.Default private var selectedAccount: Account? = null @@ -92,10 +92,10 @@ internal class ActivateCampaignsModel @Inject constructor( // Success -> the "enrolled" sheet; "already activated" error -> hand the chosen token/account // over to the "already activated" sheet. if (enrollInCampaign()) { - params.onActivated(params.campaignType) + params.modelCallbacks.onActivated(params.campaignType) } else { selectedCurrency?.let { - params.onAlreadyActivated(params.campaignType, appCurrency, selectedAccount, it) + params.modelCallbacks.onAlreadyActivated(params.campaignType, appCurrency, selectedAccount, it) } } } @@ -179,13 +179,6 @@ internal class ActivateCampaignsModel @Inject constructor( ) } - data class Params( - val campaignType: CampaignType, - val onDismiss: () -> Unit, - val onActivated: (CampaignType) -> Unit, - val onAlreadyActivated: (CampaignType, AppCurrency, Account?, CryptoCurrencyStatus) -> Unit, - ) - private companion object { // TODO([REDACTED_TASK_KEY]): replace with the real campaign terms URL. const val CAMPAIGN_TERMS_URL = "https://tangem.com/en/" diff --git a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/CampaignAlreadyActivatedModel.kt b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/CampaignAlreadyActivatedModel.kt index 4c25b2c515..83af0ce6ba 100644 --- a/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/CampaignAlreadyActivatedModel.kt +++ b/features/promo-banners/impl/src/main/kotlin/com/tangem/features/promobanners/impl/campaigns/model/CampaignAlreadyActivatedModel.kt @@ -8,11 +8,9 @@ import com.tangem.core.decompose.model.Model import com.tangem.core.decompose.model.ParamsContainer import com.tangem.core.ui.components.account.AccountIconSize import com.tangem.core.ui.components.currency.icon.CurrencyIconState -import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.models.account.Account -import com.tangem.domain.models.currency.CryptoCurrencyStatus +import com.tangem.features.promobanners.impl.campaigns.component.CampaignAlreadyActivatedBottomSheetComponent import com.tangem.features.promobanners.impl.campaigns.entity.CampaignAlreadyActivatedUM -import com.tangem.features.promobanners.impl.campaigns.entity.CampaignType import com.tangem.features.promobanners.impl.campaigns.entity.SelectedAccountUM import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow @@ -34,7 +32,7 @@ internal class CampaignAlreadyActivatedModel @Inject constructor( override val dispatchers: CoroutineDispatcherProvider, ) : Model() { - private val params = paramsContainer.require() + private val params = paramsContainer.require() private val accountIconConverter = AccountIconItemStateConverter(size = AccountIconSize.ExtraSmall) val uiState: StateFlow @@ -62,12 +60,4 @@ internal class CampaignAlreadyActivatedModel @Inject constructor( selectedAccount = selectedAccountUM, ) } - - data class Params( - val campaignType: CampaignType, - val account: Account?, - val appCurrency: AppCurrency, - val currency: CryptoCurrencyStatus, - val onDismiss: () -> Unit, - ) } \ No newline at end of file