Updated on 2026-08-14

This commit is contained in:
Tangem 2026-07-09 09:01:19 +02:00
parent f692cd4788
commit 3e250db77c
5 changed files with 55 additions and 42 deletions

View file

@ -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
}
}

View file

@ -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,
)
}

View file

@ -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,
),
)
}

View file

@ -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<Params>()
private val params = paramsContainer.require<ActivateCampaignBottomSheetComponent.Params>()
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/"

View file

@ -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<Params>()
private val params = paramsContainer.require<CampaignAlreadyActivatedBottomSheetComponent.Params>()
private val accountIconConverter = AccountIconItemStateConverter(size = AccountIconSize.ExtraSmall)
val uiState: StateFlow<CampaignAlreadyActivatedUM>
@ -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,
)
}