Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-07 01:10:09 -07:00
parent 7378429e90
commit a075d9737b
8 changed files with 107 additions and 31 deletions

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.limit.setup
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
@ -20,6 +21,7 @@ import com.tangem.domain.models.account.requireCardWithId
import com.tangem.domain.models.pay.TangemPayCardLimitPeriod
import com.tangem.domain.pay.flow.PaymentAccountStatusSupplier
import com.tangem.domain.pay.usecase.SetTangemPayCardLimitUseCase
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.navigation.TangemPayCardDetailsInnerRoute
@ -32,6 +34,7 @@ import java.math.BigDecimal
import java.util.Currency
import javax.inject.Inject
@Suppress("LongParameterList")
@Stable
@ModelScoped
internal class TangemPayCardLimitSetupModel @Inject constructor(
@ -41,6 +44,7 @@ internal class TangemPayCardLimitSetupModel @Inject constructor(
private val paymentAccountStatusSupplier: PaymentAccountStatusSupplier,
private val setTangemPayCardLimitUseCase: SetTangemPayCardLimitUseCase,
private val uiMessageSender: UiMessageSender,
private val analytics: AnalyticsEventHandler,
) : Model() {
private val params: TangemPayDetailsContainerComponent.Params = paramsContainer.require()
@ -66,6 +70,7 @@ internal class TangemPayCardLimitSetupModel @Inject constructor(
)
init {
analytics.send(TangemPayAnalyticsEvents.LimitManagementOpened())
observeCardState()
}
@ -130,6 +135,7 @@ internal class TangemPayCardLimitSetupModel @Inject constructor(
val amount = uiState.value.amountFieldModel.value.toBigDecimalOrNull() ?: return
modelScope.launch {
uiState.update { it.copy(isSubmitButtonLoading = true) }
analytics.send(TangemPayAnalyticsEvents.LimitChangeConfirmed(amount.toPlainString()))
setTangemPayCardLimitUseCase(
cardId = params.config.cardId,
userWalletId = params.userWalletId,

View file

@ -100,7 +100,7 @@ internal class TangemPayCardPageModel @Inject constructor(
val symbol = getJavaCurrencyByCode(status.currencyCode).symbol
fiat(status.currencyCode, symbol)
},
onChangeClick = { router.push(TangemPayCardDetailsInnerRoute.LimitSetup) },
onChangeClick = ::onClickLimitChange,
)
} else {
TangemPayDailyLimitBlockState.Error
@ -132,6 +132,11 @@ internal class TangemPayCardPageModel @Inject constructor(
)
}
private fun onClickLimitChange() {
analytics.send(TangemPayAnalyticsEvents.LimitChangeClicked())
router.push(TangemPayCardDetailsInnerRoute.LimitSetup)
}
private fun onClickChangePIN(isPinSet: Boolean) {
if (!isPinSet) {
router.push(TangemPayCardDetailsInnerRoute.ChangePIN)

View file

@ -1,6 +1,7 @@
package com.tangem.features.tangempay.limit.setup
import com.google.common.truth.Truth.assertThat
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.decompose.model.MutableParamsContainer
import com.tangem.core.decompose.navigation.Router
import com.tangem.core.decompose.ui.UiMessageSender
@ -15,21 +16,21 @@ import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.pay.TangemPayDetailsConfig
import com.tangem.domain.pay.flow.PaymentAccountStatusSupplier
import com.tangem.domain.pay.usecase.SetTangemPayCardLimitUseCase
import com.tangem.domain.tangempay.TangemPayAnalyticsEvents
import com.tangem.domain.visa.model.TangemPayCardFrozenState
import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.flow.flowOf
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.MethodSource
import java.math.BigDecimal
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class TangemPayCardLimitSetupModelTest {
private val cardId = "test_card_id"
@ -39,6 +40,7 @@ internal class TangemPayCardLimitSetupModelTest {
private val uiMessageSender: UiMessageSender = mockk(relaxed = true)
private val setLimitUseCase: SetTangemPayCardLimitUseCase = mockk(relaxed = true)
private val paymentAccountStatusSupplier: PaymentAccountStatusSupplier = mockk()
private val analytics: AnalyticsEventHandler = mockk(relaxed = true)
private val params = TangemPayDetailsContainerComponent.Params(
userWalletId = userWalletId,
@ -90,6 +92,7 @@ internal class TangemPayCardLimitSetupModelTest {
paymentAccountStatusSupplier = paymentAccountStatusSupplier,
setTangemPayCardLimitUseCase = setLimitUseCase,
uiMessageSender = uiMessageSender,
analytics = analytics,
)
}
@ -119,7 +122,29 @@ internal class TangemPayCardLimitSetupModelTest {
}
@Nested
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
inner class Analytics {
@Test
fun `GIVEN model WHEN init THEN LimitManagementOpened is sent`() {
val model = createModel()
verify(exactly = 1) { analytics.send(TangemPayAnalyticsEvents.LimitManagementOpened()) }
model.onDestroy()
}
@Test
fun `GIVEN model WHEN onSubmitClick THEN LimitChangeConfirmed is sent`() {
val model = createModel()
model.uiState.value.amountFieldModel.onValueChange("100")
model.uiState.value.onSubmitClick()
verify(exactly = 1) { analytics.send(TangemPayAnalyticsEvents.LimitChangeConfirmed("100")) }
model.onDestroy()
}
}
@Nested
inner class Presets {
@Test
@ -143,14 +168,17 @@ internal class TangemPayCardLimitSetupModelTest {
}
}
private fun provideTestCases() = listOf(
Arguments.of("0", false),
Arguments.of("0.99", false),
Arguments.of("1", true),
Arguments.of("100", true),
Arguments.of("-1", false),
Arguments.of("", false),
Arguments.of("abc", true),
Arguments.of("1001", false),
)
private companion object {
@JvmStatic
fun provideTestCases() = listOf(
Arguments.of("0", false),
Arguments.of("0.99", false),
Arguments.of("1", true),
Arguments.of("100", true),
Arguments.of("-1", false),
Arguments.of("", false),
Arguments.of("abc", true),
Arguments.of("1001", false),
)
}
}