Updated on 2026-08-14
This commit is contained in:
parent
7378429e90
commit
a075d9737b
8 changed files with 107 additions and 31 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue