Updated on 2026-08-14
This commit is contained in:
parent
c66b64f96c
commit
c4b3de5e85
14 changed files with 212 additions and 17 deletions
|
|
@ -52,4 +52,128 @@ sealed class TangemPayAnalyticsEvents(
|
|||
categoryName = "Visa Screen",
|
||||
event = "Button - Visa Swap",
|
||||
)
|
||||
|
||||
class ChooseWalletPopup : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Onboarding",
|
||||
event = "Choose Wallet Popup",
|
||||
)
|
||||
|
||||
class CardSettingsClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Card Settings",
|
||||
)
|
||||
|
||||
class TermsAndLimitsClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Terms And Limits",
|
||||
)
|
||||
|
||||
class FreezeCardClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Freeze Card",
|
||||
)
|
||||
|
||||
class FreezeCardConfirmShown : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Popup - Freeze Confirmation",
|
||||
)
|
||||
|
||||
class FreezeCardConfirmClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Freeze Confirmation On Popup",
|
||||
)
|
||||
|
||||
class UnfreezeCardClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Unfreeze Card",
|
||||
)
|
||||
|
||||
class UnfreezeCardConfirmShown : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Popup - Unfreeze Confirmation",
|
||||
)
|
||||
|
||||
class UnfreezeCardConfirmClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Unfreeze Confirmation On Popup",
|
||||
)
|
||||
|
||||
class PinCodeClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - PIN Code",
|
||||
)
|
||||
|
||||
class ChangePinScreenShown : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Screen - Change PIN",
|
||||
)
|
||||
|
||||
class ChangePinSubmitClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Set PIN On Change PIN Screen",
|
||||
)
|
||||
|
||||
class ChangePinSuccessShown : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Message - PIN Setup Success",
|
||||
)
|
||||
|
||||
class CurrentPinShown : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Popup - Current PIN",
|
||||
)
|
||||
|
||||
class ChangePinOnCurrentPinClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Change PIN On Current PIN",
|
||||
)
|
||||
|
||||
class ViewCardDetailsClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - View Card Details",
|
||||
)
|
||||
|
||||
class CopyCardNumberClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Copy Card Number",
|
||||
)
|
||||
|
||||
class CopyCardExpiryClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Copy Card Expiry",
|
||||
)
|
||||
|
||||
class CopyCardCVVClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Copy CVV",
|
||||
)
|
||||
|
||||
class AddToWalletClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Add Card To Wallet",
|
||||
)
|
||||
|
||||
class WithdrawClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Visa Withdraw",
|
||||
)
|
||||
|
||||
class GoToSupportOnBetaBannerClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Go To Support On Beta Banner",
|
||||
)
|
||||
|
||||
class TransactionInListClicked(type: String, status: String) : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Clicked On Transaction In List",
|
||||
params = mapOf(
|
||||
"type" to type,
|
||||
"status" to status,
|
||||
),
|
||||
)
|
||||
|
||||
class SupportOnTransactionPopupClicked : TangemPayAnalyticsEvents(
|
||||
categoryName = "Visa Screen",
|
||||
event = "Button - Support On Transaction Popup",
|
||||
)
|
||||
}
|
||||
|
|
@ -3,12 +3,13 @@ package com.tangem.features.tangempay.entity
|
|||
import com.tangem.core.ui.extensions.resourceReference
|
||||
import com.tangem.domain.visa.model.TangemPayCardFrozenState
|
||||
import com.tangem.features.tangempay.details.impl.R
|
||||
import com.tangem.features.tangempay.model.CardDataType
|
||||
import com.tangem.utils.StringsSigns
|
||||
|
||||
internal class TangemPayCardDetailsBlockStateFactory(
|
||||
private val cardNumberEnd: String,
|
||||
private val onReveal: () -> Unit,
|
||||
private val onCopy: (String) -> Unit,
|
||||
private val onCopy: (String, CardDataType) -> Unit,
|
||||
) {
|
||||
|
||||
fun getInitialState() = TangemPayCardDetailsUM(
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import kotlinx.collections.immutable.toPersistentList
|
|||
@Suppress("LongParameterList")
|
||||
internal class TangemPayDetailsStateFactory(
|
||||
private val onBack: () -> Unit,
|
||||
private val onOpenMenu: () -> Unit,
|
||||
private val intents: TangemPayDetailIntents,
|
||||
private val cardFrozenState: TangemPayCardFrozenState,
|
||||
private val converter: TangemPayCardFrozenStateConverter,
|
||||
|
|
@ -47,6 +48,7 @@ internal class TangemPayDetailsStateFactory(
|
|||
return TangemPayDetailsUM(
|
||||
topBarConfig = TangemPayDetailsTopBarConfig(
|
||||
onBackClick = onBack,
|
||||
onOpenMenu = onOpenMenu,
|
||||
items = listOfNotNull(
|
||||
TangemPayDetailsTopBarMenuItem(
|
||||
type = TangemPayDetailsTopBarMenuItemType.ChangePin,
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import kotlinx.collections.immutable.ImmutableList
|
|||
|
||||
internal data class TangemPayDetailsTopBarConfig(
|
||||
val onBackClick: () -> Unit,
|
||||
val onOpenMenu: () -> Unit,
|
||||
val items: ImmutableList<TangemPayDetailsTopBarMenuItem>?,
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfi
|
|||
import com.tangem.core.ui.components.notifications.NotificationConfig
|
||||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.domain.visa.model.TangemPayCardFrozenState
|
||||
import com.tangem.features.tangempay.model.CardDataType
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
|
||||
internal data class TangemPayDetailsUM(
|
||||
|
|
@ -25,7 +26,7 @@ internal data class TangemPayCardDetailsUM(
|
|||
val cvv: String,
|
||||
val buttonText: TextReference = TextReference.EMPTY,
|
||||
val onClick: () -> Unit = {},
|
||||
val onCopy: (String) -> Unit = {},
|
||||
val onCopy: (String, CardDataType) -> Unit,
|
||||
val isHidden: Boolean = true,
|
||||
val isLoading: Boolean = false,
|
||||
val cardFrozenState: TangemPayCardFrozenState,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.features.tangempay.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -9,6 +10,7 @@ import com.tangem.core.ui.clipboard.ClipboardManager
|
|||
import com.tangem.core.ui.extensions.TextReference
|
||||
import com.tangem.core.ui.message.SnackbarMessage
|
||||
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
|
||||
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
|
||||
import com.tangem.features.tangempay.components.cardDetails.TangemPayCardDetailsBlockComponent
|
||||
import com.tangem.features.tangempay.details.impl.R
|
||||
import com.tangem.features.tangempay.entity.TangemPayCardDetailsBlockStateFactory
|
||||
|
|
@ -29,6 +31,7 @@ import com.tangem.utils.transformer.update as transformerUpdate
|
|||
|
||||
private const val SHOW_DETAILS_TIME = 30_000L
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@Stable
|
||||
@ModelScoped
|
||||
internal class TangemPayCardDetailsBlockModel @Inject constructor(
|
||||
|
|
@ -38,6 +41,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
|
|||
private val clipboardManager: ClipboardManager,
|
||||
private val uiMessageSender: UiMessageSender,
|
||||
private val cardDetailsEventListener: CardDetailsEventListener,
|
||||
private val analytics: AnalyticsEventHandler,
|
||||
) : Model() {
|
||||
|
||||
private val params: TangemPayCardDetailsBlockComponent.Params = paramsContainer.require()
|
||||
|
|
@ -74,6 +78,7 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun revealCardDetails() {
|
||||
analytics.send(TangemPayAnalyticsEvents.ViewCardDetailsClicked())
|
||||
modelScope.launch {
|
||||
uiState.transformerUpdate(
|
||||
transformer = DetailsRevealProgressStateTransformer(onClickHide = ::hideCardDetails),
|
||||
|
|
@ -115,7 +120,17 @@ internal class TangemPayCardDetailsBlockModel @Inject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private fun copyData(text: String) {
|
||||
private fun copyData(text: String, type: CardDataType) {
|
||||
val event = when (type) {
|
||||
CardDataType.Number -> TangemPayAnalyticsEvents.CopyCardNumberClicked()
|
||||
CardDataType.Expiry -> TangemPayAnalyticsEvents.CopyCardExpiryClicked()
|
||||
CardDataType.CVV -> TangemPayAnalyticsEvents.CopyCardCVVClicked()
|
||||
}
|
||||
analytics.send(event)
|
||||
clipboardManager.setText(text = text.filterNot { it.isWhitespace() }, isSensitive = true)
|
||||
}
|
||||
}
|
||||
|
||||
internal enum class CardDataType {
|
||||
Number, Expiry, CVV
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.features.tangempay.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -10,6 +11,7 @@ import com.tangem.core.ui.extensions.resourceReference
|
|||
import com.tangem.core.ui.message.ToastMessage
|
||||
import com.tangem.domain.pay.model.SetPinResult
|
||||
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
|
||||
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
|
||||
import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent
|
||||
import com.tangem.features.tangempay.details.impl.R
|
||||
import com.tangem.features.tangempay.entity.TangemPayChangePinUM
|
||||
|
|
@ -30,17 +32,23 @@ internal class TangemPayChangePinModel @Inject constructor(
|
|||
private val uiMessageSender: UiMessageSender,
|
||||
private val router: Router,
|
||||
private val cardDetailsRepository: TangemPayCardDetailsRepository,
|
||||
private val analytics: AnalyticsEventHandler,
|
||||
) : Model() {
|
||||
|
||||
private val params: TangemPayDetailsContainerComponent.Params = paramsContainer.require()
|
||||
val uiState: StateFlow<TangemPayChangePinUM>
|
||||
field = MutableStateFlow(getInitialState())
|
||||
|
||||
init {
|
||||
analytics.send(TangemPayAnalyticsEvents.ChangePinScreenShown())
|
||||
}
|
||||
|
||||
private fun onPinCodeChange(pin: String) {
|
||||
uiState.update(transformer = PinCodeChangeTransformer(newPin = pin))
|
||||
}
|
||||
|
||||
private fun onClickSubmit() {
|
||||
analytics.send(TangemPayAnalyticsEvents.ChangePinSubmitClicked())
|
||||
modelScope.launch {
|
||||
uiState.update { it.copy(submitButtonLoading = true) }
|
||||
val result = try {
|
||||
|
|
@ -59,7 +67,10 @@ internal class TangemPayChangePinModel @Inject constructor(
|
|||
message = ToastMessage(resourceReference(R.string.tangempay_pin_validation_error_message)),
|
||||
)
|
||||
}
|
||||
SetPinResult.SUCCESS -> router.push(TangemPayDetailsInnerRoute.ChangePINSuccess)
|
||||
SetPinResult.SUCCESS -> {
|
||||
analytics.send(TangemPayAnalyticsEvents.ChangePinSuccessShown())
|
||||
router.push(TangemPayDetailsInnerRoute.ChangePINSuccess)
|
||||
}
|
||||
SetPinResult.DECRYPTION_ERROR,
|
||||
SetPinResult.UNKNOWN_ERROR,
|
||||
null,
|
||||
|
|
|
|||
|
|
@ -90,6 +90,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
private val cardFrozenStateConverter = TangemPayCardFrozenStateConverter(onUnfreezeClick = ::onClickUnfreezeCard)
|
||||
private val stateFactory = TangemPayDetailsStateFactory(
|
||||
onBack = router::pop,
|
||||
onOpenMenu = ::onOpenMenu,
|
||||
intents = this,
|
||||
cardFrozenState = params.config.cardFrozenState,
|
||||
converter = cardFrozenStateConverter,
|
||||
|
|
@ -148,6 +149,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onClickPinCode() {
|
||||
analytics.send(TangemPayAnalyticsEvents.PinCodeClicked())
|
||||
if (!params.config.isPinSet) {
|
||||
router.push(TangemPayDetailsInnerRoute.ChangePIN)
|
||||
} else {
|
||||
|
|
@ -161,14 +163,19 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onClickFreezeCard() {
|
||||
analytics.send(TangemPayAnalyticsEvents.FreezeCardClicked())
|
||||
uiMessageSender.send(TangemPayMessagesFactory.createFreezeCardMessage(onFreezeClicked = ::freezeCard))
|
||||
analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmShown())
|
||||
}
|
||||
|
||||
override fun onClickUnfreezeCard() {
|
||||
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardClicked())
|
||||
uiMessageSender.send(TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard))
|
||||
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmShown())
|
||||
}
|
||||
|
||||
private fun freezeCard() {
|
||||
analytics.send(TangemPayAnalyticsEvents.FreezeCardConfirmClicked())
|
||||
modelScope.launch {
|
||||
val result = try {
|
||||
cardDetailsRepository.freezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId)
|
||||
|
|
@ -207,6 +214,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun unfreezeCard() {
|
||||
analytics.send(TangemPayAnalyticsEvents.UnfreezeCardConfirmClicked())
|
||||
modelScope.launch {
|
||||
val result = try {
|
||||
cardDetailsRepository.unfreezeCard(userWalletId = params.userWalletId, cardId = params.config.cardId)
|
||||
|
|
@ -264,6 +272,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onClickWithdraw() {
|
||||
analytics.send(TangemPayAnalyticsEvents.WithdrawClicked())
|
||||
val currentBalance = balance
|
||||
val depositAddress = currentBalance?.depositAddress
|
||||
if (currentBalance == null || depositAddress == null) {
|
||||
|
|
@ -345,6 +354,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onContactSupportClicked() {
|
||||
analytics.send(TangemPayAnalyticsEvents.GoToSupportOnBetaBannerClicked())
|
||||
modelScope.launch {
|
||||
sendFeedbackEmailUseCase.invoke(
|
||||
type = FeedbackEmailType.Visa.FeatureIsBeta(
|
||||
|
|
@ -366,6 +376,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun onClickAddToWalletBlock() {
|
||||
analytics.send(TangemPayAnalyticsEvents.AddToWalletClicked())
|
||||
router.push(TangemPayDetailsInnerRoute.AddToWallet)
|
||||
}
|
||||
|
||||
|
|
@ -386,6 +397,10 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}.saveIn(addToWalletBannerJobHolder)
|
||||
}
|
||||
|
||||
private fun onOpenMenu() {
|
||||
analytics.send(TangemPayAnalyticsEvents.CardSettingsClicked())
|
||||
}
|
||||
|
||||
override fun onClickSwap(data: TangemPayTopUpData) {
|
||||
analytics.send(TangemPayAnalyticsEvents.SwapClicked())
|
||||
bottomSheetNavigation.dismiss()
|
||||
|
|
@ -424,6 +439,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
|
||||
override fun onClickChangePin() {
|
||||
bottomSheetNavigation.dismiss()
|
||||
analytics.send(TangemPayAnalyticsEvents.ChangePinOnCurrentPinClicked())
|
||||
router.push(TangemPayDetailsInnerRoute.ChangePIN)
|
||||
}
|
||||
|
||||
|
|
@ -432,6 +448,13 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onTransactionClick(item: TangemPayTxHistoryItem) {
|
||||
val (type, status) = when (item) {
|
||||
is TangemPayTxHistoryItem.Collateral -> "collateral" to "unknown"
|
||||
is TangemPayTxHistoryItem.Fee -> "fee" to "unknown"
|
||||
is TangemPayTxHistoryItem.Payment -> "payment" to "unknown"
|
||||
is TangemPayTxHistoryItem.Spend -> "spend" to item.status.name.lowercase()
|
||||
}
|
||||
analytics.send(TangemPayAnalyticsEvents.TransactionInListClicked(type = type, status = status))
|
||||
bottomSheetNavigation.activate(
|
||||
configuration = TangemPayDetailsNavigation.TransactionDetails(
|
||||
transaction = item,
|
||||
|
|
@ -441,6 +464,7 @@ internal class TangemPayDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onClickTermsAndLimits() {
|
||||
analytics.send(TangemPayAnalyticsEvents.TermsAndLimitsClicked())
|
||||
urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.features.tangempay.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
|
|
@ -9,6 +10,7 @@ import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
|
|||
import com.tangem.domain.feedback.GetWalletMetaInfoUseCase
|
||||
import com.tangem.domain.feedback.SendFeedbackEmailUseCase
|
||||
import com.tangem.domain.feedback.models.FeedbackEmailType
|
||||
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
|
||||
import com.tangem.features.tangempay.components.txHistory.TangemPayTxHistoryDetailsComponent
|
||||
import com.tangem.features.tangempay.entity.TangemPayTxHistoryDetailsUM
|
||||
import com.tangem.features.tangempay.model.transformers.TangemPayTxHistoryDetailsConverter
|
||||
|
|
@ -17,6 +19,7 @@ import kotlinx.coroutines.flow.*
|
|||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
@Suppress("LongParameterList")
|
||||
@Stable
|
||||
@ModelScoped
|
||||
internal class TangemPayTxHistoryDetailsModel @Inject constructor(
|
||||
|
|
@ -25,6 +28,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor(
|
|||
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
|
||||
private val urlOpener: UrlOpener,
|
||||
private val balanceHidingSettings: GetBalanceHidingSettingsUseCase,
|
||||
private val analytics: AnalyticsEventHandler,
|
||||
paramsContainer: ParamsContainer,
|
||||
) : Model() {
|
||||
|
||||
|
|
@ -61,6 +65,7 @@ internal class TangemPayTxHistoryDetailsModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun dispute() {
|
||||
analytics.send(TangemPayAnalyticsEvents.SupportOnTransactionPopupClicked())
|
||||
modelScope.launch {
|
||||
val walletMetaInfo = getWalletMetaInfoUseCase.invoke(params.userWalletId).getOrNull() ?: return@launch
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
package com.tangem.features.tangempay.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.core.decompose.model.ParamsContainer
|
||||
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
|
||||
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
|
||||
import com.tangem.features.tangempay.components.TangemPayViewPinComponent
|
||||
import com.tangem.features.tangempay.entity.TangemPayViewPinUM
|
||||
import com.tangem.features.tangempay.model.transformers.TangemPayViewPinErrorStateTransformer
|
||||
|
|
@ -22,6 +24,7 @@ internal class TangemPayViewPinModel @Inject constructor(
|
|||
paramsContainer: ParamsContainer,
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
private val cardDetailsRepository: TangemPayCardDetailsRepository,
|
||||
private val analytics: AnalyticsEventHandler,
|
||||
) : Model() {
|
||||
|
||||
private val params = paramsContainer.require<TangemPayViewPinComponent.Params>()
|
||||
|
|
@ -30,6 +33,7 @@ internal class TangemPayViewPinModel @Inject constructor(
|
|||
field = MutableStateFlow(getInitialState())
|
||||
|
||||
init {
|
||||
analytics.send(TangemPayAnalyticsEvents.CurrentPinShown())
|
||||
getCardPin()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ private fun PreviewTangemPayAddToWalletScreen() {
|
|||
numberShort = "*1245",
|
||||
expiry = "••/••",
|
||||
cvv = "•••",
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
onClick = {},
|
||||
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
|
||||
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import com.tangem.core.ui.res.TangemThemePreview
|
|||
import com.tangem.domain.visa.model.TangemPayCardFrozenState
|
||||
import com.tangem.features.tangempay.details.impl.R
|
||||
import com.tangem.features.tangempay.entity.TangemPayCardDetailsUM
|
||||
import com.tangem.features.tangempay.model.CardDataType
|
||||
|
||||
private val CustomCardBlockColor = Color(0x1F828282)
|
||||
|
||||
|
|
@ -79,9 +80,9 @@ internal fun TangemPayCard(state: TangemPayCardDetailsUM, modifier: Modifier = M
|
|||
cardNumber = state.number,
|
||||
expiry = state.expiry,
|
||||
cvv = state.cvv,
|
||||
onCopyCardNumber = { state.onCopy(state.number) },
|
||||
onCopyCvv = { state.onCopy(state.cvv) },
|
||||
onCopyExpiry = { state.onCopy(state.expiry) },
|
||||
onCopyCardNumber = { state.onCopy(state.number, CardDataType.Number) },
|
||||
onCopyCvv = { state.onCopy(state.cvv, CardDataType.CVV) },
|
||||
onCopyExpiry = { state.onCopy(state.expiry, CardDataType.Expiry) },
|
||||
onHideDetails = state.onClick,
|
||||
modifier = Modifier.graphicsLayer { rotationY = 180f },
|
||||
)
|
||||
|
|
@ -309,7 +310,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
|
|||
expiry = "",
|
||||
cvv = "",
|
||||
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
isHidden = true,
|
||||
cardFrozenState = TangemPayCardFrozenState.Frozen,
|
||||
),
|
||||
|
|
@ -321,7 +322,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
|
|||
expiry = "",
|
||||
cvv = "",
|
||||
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
isHidden = true,
|
||||
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
|
||||
),
|
||||
|
|
@ -333,7 +334,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
|
|||
expiry = "",
|
||||
cvv = "",
|
||||
buttonText = resourceReference(R.string.tangempay_card_details_show_details),
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
isHidden = true,
|
||||
cardFrozenState = TangemPayCardFrozenState.Pending,
|
||||
),
|
||||
|
|
@ -341,7 +342,7 @@ private class TangemPayCardDetailsUMProvider : CollectionPreviewParameterProvide
|
|||
isLoading = false,
|
||||
onClick = {},
|
||||
buttonText = resourceReference(R.string.tangempay_card_details_hide_details),
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
isHidden = false,
|
||||
number = "1234 5678 9012 3456",
|
||||
numberShort = "*3456",
|
||||
|
|
|
|||
|
|
@ -254,7 +254,12 @@ private fun TangemPayDetailsTopAppBar(config: TangemPayDetailsTopBarConfig, modi
|
|||
title = {},
|
||||
actions = {
|
||||
AnimatedVisibility(visible = config.items != null && config.items.isNotEmpty()) {
|
||||
IconButton(onClick = { showDropdownMenu = true }) {
|
||||
IconButton(
|
||||
onClick = {
|
||||
config.onOpenMenu()
|
||||
showDropdownMenu = true
|
||||
},
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(id = R.drawable.ic_more_vertical_24),
|
||||
tint = TangemTheme.colors.icon.primary1,
|
||||
|
|
@ -305,7 +310,7 @@ private fun TangemPayDetailsScreenPreview(
|
|||
numberShort = "*1245",
|
||||
expiry = "••/••",
|
||||
cvv = "•••",
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
onClick = {},
|
||||
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
|
||||
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
|
||||
|
|
@ -319,7 +324,7 @@ private fun TangemPayDetailsScreenPreview(
|
|||
private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<TangemPayDetailsUM>(
|
||||
collection = listOf(
|
||||
TangemPayDetailsUM(
|
||||
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, items = null),
|
||||
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, onOpenMenu = {}, items = null),
|
||||
pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}),
|
||||
balanceBlockState = TangemPayDetailsBalanceBlockState.Content(
|
||||
actionButtons = persistentListOf(
|
||||
|
|
@ -348,7 +353,7 @@ private class TangemPayDetailsUMProvider : CollectionPreviewParameterProvider<Ta
|
|||
),
|
||||
),
|
||||
TangemPayDetailsUM(
|
||||
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, items = null),
|
||||
topBarConfig = TangemPayDetailsTopBarConfig(onBackClick = {}, onOpenMenu = {}, items = null),
|
||||
pullToRefreshConfig = PullToRefreshConfig(isRefreshing = false, onRefresh = {}),
|
||||
balanceBlockState = TangemPayDetailsBalanceBlockState.Loading(actionButtons = persistentListOf()),
|
||||
addToWalletBlockState = AddToWalletBlockState({}, {}),
|
||||
|
|
@ -384,7 +389,7 @@ private fun TangemPayDetailsTxHistoryScreenPreview(
|
|||
numberShort = "*1245",
|
||||
expiry = "••/••",
|
||||
cvv = "•••",
|
||||
onCopy = {},
|
||||
onCopy = { _, _ -> },
|
||||
onClick = {},
|
||||
buttonText = TextReference.Res(R.string.tangempay_card_details_hide_text),
|
||||
cardFrozenState = TangemPayCardFrozenState.Unfrozen,
|
||||
|
|
|
|||
|
|
@ -151,6 +151,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
|
|||
if (eligibleWalletsIds.size == 1) {
|
||||
checkCustomerInfo(userWalletId = eligibleWalletsIds[0])
|
||||
} else {
|
||||
analytics.send(TangemPayAnalyticsEvents.ChooseWalletPopup())
|
||||
bottomSheetNavigation.activate(TangemPayOnboardingNavigation.WalletSelector(eligibleWalletsIds))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue