Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-15 05:44:29 -07:00
parent 8a749438bf
commit 8098476fde
15 changed files with 459 additions and 180 deletions

View file

@ -7,7 +7,7 @@ import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.core.decompose.model.getOrCreateModel
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.pay.model.TangemPayReissueOrderInfo
import com.tangem.domain.pay.model.TangemPayOrderInfo
import com.tangem.features.tangempay.model.TangemPayReissueCardModel
import com.tangem.features.tangempay.ui.TangemPayReissueCardContent
@ -34,7 +34,7 @@ internal class TangemPayReissueCardComponent(
}
internal interface ReissueCardListener {
fun onReissueOrderCreate(order: TangemPayReissueOrderInfo)
fun onReissueOrderCreate(order: TangemPayOrderInfo)
fun onDismissReissueCard()
fun onClickAddFunds()
}

View file

@ -19,6 +19,7 @@ import com.tangem.core.ui.format.bigdecimal.format
import com.tangem.core.ui.format.bigdecimal.getJavaCurrencyByCode
import com.tangem.core.ui.format.bigdecimal.optionalDecimals
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.core.ui.test.TangemPayTestTags
import com.tangem.domain.models.StatusSource
import com.tangem.domain.models.TokenReceiveConfig
import com.tangem.domain.models.account.PaymentAccountStatusValue
@ -28,12 +29,12 @@ import com.tangem.domain.models.pay.TangemPayCard
import com.tangem.domain.models.pay.TangemPayCardLimitPeriod
import com.tangem.domain.pay.flow.PaymentAccountStatusSupplier
import com.tangem.domain.pay.model.OrderStatus
import com.tangem.domain.pay.model.TangemPayReissueOrderInfo
import com.tangem.domain.pay.model.TangemPayOrderInfo
import com.tangem.domain.pay.model.TangemPayTopUpData
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.pay.repository.TangemPayReissueCardRepository
import com.tangem.domain.pay.usecase.ChangeCardFrozenStateUseCase
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.features.tangempay.components.AddFundsListener
import com.tangem.features.tangempay.components.ReissueCardListener
import com.tangem.features.tangempay.components.TangemPayCardPageComponent
@ -63,12 +64,14 @@ internal class TangemPayCardPageModel @Inject constructor(
private val cardDetailsRepository: TangemPayCardDetailsRepository,
private val uiMessageSender: UiMessageSender,
private val reissueCardRepository: TangemPayReissueCardRepository,
private val changeCardFrozenStateUseCase: ChangeCardFrozenStateUseCase,
) : Model(), ViewPinListener, ReissueCardListener, AddFundsListener {
private val params: TangemPayCardPageComponent.Params = paramsContainer.require()
private val addToWalletBannerJobHolder = JobHolder()
private val addFundsJobHolder = JobHolder()
private val frozenStateJobHolder = JobHolder()
val uiState: StateFlow<TangemPayCardPageUM>
field = MutableStateFlow(
@ -119,12 +122,18 @@ internal class TangemPayCardPageModel @Inject constructor(
TangemPayCardPageSetting(
title = TextReference.Res(R.string.tangempay_card_details_change_pin),
onSettingClick = { onClickChangePIN(card.hasPinCode) },
testTag = com.tangem.core.ui.test.TangemPayTestTags.CHANGE_PIN_ROW,
testTag = TangemPayTestTags.CHANGE_PIN_ROW,
),
TangemPayCardPageSetting(
title = TextReference.Res(R.string.tangempay_card_details_freeze_card),
title = TextReference.Res(
if (card.isFrozen) {
R.string.tangempay_card_details_unfreeze_card
} else {
R.string.tangempay_card_details_freeze_card
},
),
onSettingClick = { onClickFreezeOrUnfreezeCard(card.isFrozen) },
testTag = com.tangem.core.ui.test.TangemPayTestTags.FREEZE_CARD_ROW,
testTag = TangemPayTestTags.FREEZE_CARD_ROW,
),
TangemPayCardPageSetting(
title = TextReference.Res(R.string.tangempay_card_details_reissue_card),
@ -152,6 +161,8 @@ internal class TangemPayCardPageModel @Inject constructor(
}
private fun onClickFreezeOrUnfreezeCard(isFrozen: Boolean) {
if (frozenStateJobHolder.isActive) return
val message = if (isFrozen) {
TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard)
} else {
@ -165,7 +176,7 @@ internal class TangemPayCardPageModel @Inject constructor(
bottomSheetNavigation.activate(TangemPayCardNavigation.ReissueCard)
}
override fun onReissueOrderCreate(order: TangemPayReissueOrderInfo) {
override fun onReissueOrderCreate(order: TangemPayOrderInfo) {
bottomSheetNavigation.dismiss()
onReissueOrderStatusReceived(order.orderStatus)
if (order.orderStatus != OrderStatus.CANCELED) {
@ -238,40 +249,34 @@ internal class TangemPayCardPageModel @Inject constructor(
private fun freezeCard() {
modelScope.launch {
cardDetailsRepository.freezeCard(
changeCardFrozenStateUseCase(
userWalletId = params.userWalletId,
cardId = params.config.cardId,
isFreezing = true,
).onLeft {
val message = SnackbarMessage(resourceReference(R.string.tangem_pay_freeze_card_failed))
uiMessageSender.send(message)
}.onRight { state ->
val message = if (state == TangemPayCardFrozenState.Frozen) {
SnackbarMessage(resourceReference(R.string.tangem_pay_freeze_card_success))
} else {
SnackbarMessage(resourceReference(R.string.tangem_pay_freeze_card_failed))
}
}.onRight {
val message = SnackbarMessage(resourceReference(R.string.tangem_pay_freeze_card_success))
uiMessageSender.send(message)
}
}
}.saveIn(frozenStateJobHolder)
}
private fun unfreezeCard() {
modelScope.launch {
cardDetailsRepository.unfreezeCard(
changeCardFrozenStateUseCase(
userWalletId = params.userWalletId,
cardId = params.config.cardId,
isFreezing = false,
).onLeft {
val message = SnackbarMessage(resourceReference(R.string.tangem_pay_unfreeze_card_failed))
uiMessageSender.send(message)
}.onRight { state ->
val message = if (state == TangemPayCardFrozenState.Unfrozen) {
SnackbarMessage(resourceReference(R.string.tangem_pay_unfreeze_card_success))
} else {
SnackbarMessage(resourceReference(R.string.tangem_pay_unfreeze_card_failed))
}
}.onRight {
val message = SnackbarMessage(resourceReference(R.string.tangem_pay_unfreeze_card_success))
uiMessageSender.send(message)
}
}
}.saveIn(frozenStateJobHolder)
}
private fun fetchAddToWalletBanner() {