diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt
index ef565f5f96..30a3300678 100644
--- a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt
+++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt
@@ -31,7 +31,7 @@ internal class TangemPay(
private fun createDevEnvironment(): ApiEnvironmentConfig = ApiEnvironmentConfig(
environment = ApiEnvironment.DEV,
- baseUrl = "[REDACTED_ENV_URL]",
+ baseUrl = "https://api.dev.us.paera.com/bff/",
headers = createHeaders(),
)
diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt
index 08e894665d..8524296e8b 100644
--- a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt
+++ b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt
@@ -241,7 +241,7 @@ internal class ProdApiConfigsManagerTest {
id = ApiConfig.ID.TangemPay,
expected = ApiEnvironmentConfig(
environment = ApiEnvironment.DEV,
- baseUrl = "[REDACTED_ENV_URL]",
+ baseUrl = "https://api.dev.us.paera.com/bff/",
headers = mapOf(
"version" to ProviderSuspend { VERSION_NAME },
"platform" to ProviderSuspend { "Android" },
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 8251fd72f0..433f57b894 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -1380,6 +1380,7 @@
Declined
Pending
Terms, Fees & Limits
+ Terms and Limits
The bank rejected this transaction request.
This fee goes to cover the cost of handling your transfer.
Keep using your money. You can freeze anytime.
@@ -1433,7 +1434,7 @@
Pay exactly what you see
A separate payment account will be created without disclosing your addresses and assets
Unrivaled privacy
- Get your free Crypto Card\nin minutes
+ Get your free Tangem Pay Card in minutes
We’re fixing a technical issue. Please try again later.
Service temporarily unavailable
Tangem Pay
diff --git a/features/tangempay/details/api/src/main/kotlin/com/tangem/features/tangempay/TangemPayConstants.kt b/features/tangempay/details/api/src/main/kotlin/com/tangem/features/tangempay/TangemPayConstants.kt
new file mode 100644
index 0000000000..5a9903bfd6
--- /dev/null
+++ b/features/tangempay/details/api/src/main/kotlin/com/tangem/features/tangempay/TangemPayConstants.kt
@@ -0,0 +1,5 @@
+package com.tangem.features.tangempay
+
+object TangemPayConstants {
+ const val TERMS_AND_LIMITS_LINK = "https://tangem.com/docs/en/tangem-visa-tariffs.pdf"
+}
\ No newline at end of file
diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt
index a51d398d92..0acd6d5f66 100644
--- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt
+++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsStateFactory.kt
@@ -2,23 +2,19 @@ package com.tangem.features.tangempay.entity
import com.tangem.core.ui.components.buttons.actions.ActionButtonConfig
import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig
-import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig.ShowRefreshState
import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenuItem
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.themedColor
import com.tangem.core.ui.res.TangemTheme
import com.tangem.features.tangempay.details.impl.R
+import com.tangem.features.tangempay.utils.TangemPayDetailIntents
import kotlinx.collections.immutable.persistentListOf
@Suppress("LongParameterList")
internal class TangemPayDetailsStateFactory(
private val onBack: () -> Unit,
- private val onRefresh: (ShowRefreshState) -> Unit,
- private val onAddFunds: () -> Unit,
- private val onClickChangePin: () -> Unit,
+ private val intents: TangemPayDetailIntents,
private val isCardFrozen: Boolean,
- private val onClickFreezeCard: () -> Unit,
- private val onClickUnfreezeCard: () -> Unit,
) {
fun getInitialState(): TangemPayDetailsUM {
@@ -28,7 +24,7 @@ internal class TangemPayDetailsStateFactory(
dropdownItem = TangemDropdownMenuItem(
title = resourceReference(R.string.tangempay_card_details_unfreeze_card),
textColor = themedColor { TangemTheme.colors.text.primary1 },
- onClick = onClickUnfreezeCard,
+ onClick = intents::onClickUnfreezeCard,
),
)
} else {
@@ -37,7 +33,7 @@ internal class TangemPayDetailsStateFactory(
dropdownItem = TangemDropdownMenuItem(
title = resourceReference(R.string.tangempay_card_details_freeze_card),
textColor = themedColor { TangemTheme.colors.text.primary1 },
- onClick = onClickFreezeCard,
+ onClick = intents::onClickFreezeCard,
),
)
}
@@ -51,7 +47,15 @@ internal class TangemPayDetailsStateFactory(
dropdownItem = TangemDropdownMenuItem(
title = resourceReference(R.string.tangempay_card_details_change_pin),
textColor = themedColor { TangemTheme.colors.text.primary1 },
- onClick = onClickChangePin,
+ onClick = intents::onClickChangePin,
+ ),
+ ),
+ TangemPayDetailsTopBarMenuItem(
+ type = TangemPayDetailsTopBarMenuItemType.TermsAndLimits,
+ dropdownItem = TangemDropdownMenuItem(
+ title = resourceReference(R.string.tangem_pay_terms_limits),
+ textColor = themedColor { TangemTheme.colors.text.primary1 },
+ onClick = intents::onClickTermsAndLimits,
),
),
cardFrozenStateItem,
@@ -59,18 +63,18 @@ internal class TangemPayDetailsStateFactory(
),
pullToRefreshConfig = PullToRefreshConfig(
isRefreshing = false,
- onRefresh = onRefresh,
+ onRefresh = intents::onRefreshSwipe,
),
balanceBlockState = TangemPayDetailsBalanceBlockState.Loading(
actionButtons = persistentListOf(
ActionButtonConfig(
text = resourceReference(id = R.string.tangempay_card_details_add_funds),
iconResId = R.drawable.ic_arrow_down_24,
- onClick = onAddFunds,
+ onClick = intents::onClickAddFunds,
),
),
frozenState = if (isCardFrozen) {
- CardFrozenState.Frozen(onClickUnfreezeCard)
+ CardFrozenState.Frozen(intents::onClickUnfreezeCard)
} else {
CardFrozenState.Unfrozen
},
diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt
index 146ace6860..1010496a66 100644
--- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt
+++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/entity/TangemPayDetailsTopBarConfig.kt
@@ -15,6 +15,7 @@ internal data class TangemPayDetailsTopBarMenuItem(
internal enum class TangemPayDetailsTopBarMenuItemType {
ChangePin,
+ TermsAndLimits,
FreezeCard,
UnfreezeCard,
}
\ No newline at end of file
diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt
index 00ead0ebbb..1a1e789e5f 100644
--- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt
+++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayDetailsModel.kt
@@ -11,6 +11,7 @@ import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.navigation.Router
import com.tangem.core.decompose.ui.UiMessageSender
+import com.tangem.core.navigation.url.UrlOpener
import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig.ShowRefreshState
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.SnackbarMessage
@@ -19,6 +20,7 @@ import com.tangem.domain.pay.TangemPayTopUpData
import com.tangem.domain.pay.model.TangemPayCardBalance
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.domain.visa.model.TangemPayTxHistoryItem
+import com.tangem.features.tangempay.TangemPayConstants
import com.tangem.features.tangempay.components.AddFundsListener
import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent
import com.tangem.features.tangempay.details.impl.R
@@ -30,6 +32,7 @@ import com.tangem.features.tangempay.model.listener.CardDetailsEvent
import com.tangem.features.tangempay.model.listener.CardDetailsEventListener
import com.tangem.features.tangempay.model.transformers.*
import com.tangem.features.tangempay.navigation.TangemPayDetailsInnerRoute
+import com.tangem.features.tangempay.utils.TangemPayDetailIntents
import com.tangem.features.tangempay.utils.TangemPayMessagesFactory
import com.tangem.features.tangempay.utils.TangemPayTxHistoryUiActions
import com.tangem.features.tangempay.utils.TangemPayTxHistoryUpdateListener
@@ -50,22 +53,19 @@ internal class TangemPayDetailsModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
private val router: Router,
+ private val urlOpener: UrlOpener,
private val cardDetailsRepository: TangemPayCardDetailsRepository,
private val uiMessageSender: UiMessageSender,
private val cardDetailsEventListener: CardDetailsEventListener,
private val txHistoryUpdateListener: TangemPayTxHistoryUpdateListener,
-) : Model(), TangemPayTxHistoryUiActions, AddFundsListener {
+) : Model(), TangemPayTxHistoryUiActions, TangemPayDetailIntents, AddFundsListener {
private val params: TangemPayDetailsContainerComponent.Params = paramsContainer.require()
private val stateFactory = TangemPayDetailsStateFactory(
onBack = router::pop,
- onRefresh = ::onRefreshSwipe,
- onAddFunds = ::onClickAddFunds,
- onClickChangePin = ::onClickChangePin,
+ intents = this,
isCardFrozen = params.config.isCardFrozen,
- onClickFreezeCard = ::onClickFreezeCard,
- onClickUnfreezeCard = ::onClickUnfreezeCard,
)
val uiState: StateFlow
@@ -84,15 +84,15 @@ internal class TangemPayDetailsModel @Inject constructor(
fetchBalance()
}
- private fun onClickChangePin() {
+ override fun onClickChangePin() {
router.push(TangemPayDetailsInnerRoute.ChangePIN)
}
- private fun onClickFreezeCard() {
+ override fun onClickFreezeCard() {
uiMessageSender.send(TangemPayMessagesFactory.createFreezeCardMessage(onFreezeClicked = ::freezeCard))
}
- private fun onClickUnfreezeCard() {
+ override fun onClickUnfreezeCard() {
uiMessageSender.send(TangemPayMessagesFactory.createUnfreezeCardMessage(onUnfreezeClicked = ::unfreezeCard))
}
@@ -150,7 +150,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}
}
- private fun onClickAddFunds() {
+ override fun onClickAddFunds() {
if (params.config.depositAddress == null || balance == null) {
showBottomSheetError(TangemPayDetailsErrorType.Receive)
} else {
@@ -187,7 +187,7 @@ internal class TangemPayDetailsModel @Inject constructor(
}.saveIn(addToWalletBannerJobHolder)
}
- private fun onRefreshSwipe(refreshState: ShowRefreshState) {
+ override fun onRefreshSwipe(refreshState: ShowRefreshState) {
modelScope.launch {
uiState.update(TangemPayDetailsRefreshTransformer(isRefreshing = refreshState.value))
cardDetailsEventListener.send(CardDetailsEvent.Hide)
@@ -251,6 +251,10 @@ internal class TangemPayDetailsModel @Inject constructor(
bottomSheetNavigation.activate(TangemPayDetailsNavigation.TransactionDetails(item))
}
+ override fun onClickTermsAndLimits() {
+ urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
+ }
+
private fun showBottomSheetError(type: TangemPayDetailsErrorType) {
uiMessageSender.send(message = TangemPayMessagesFactory.createErrorMessage(type = type))
}
diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/TangemPayDetailIntents.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/TangemPayDetailIntents.kt
new file mode 100644
index 0000000000..dbbe82010d
--- /dev/null
+++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/utils/TangemPayDetailIntents.kt
@@ -0,0 +1,12 @@
+package com.tangem.features.tangempay.utils
+
+import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig.ShowRefreshState
+
+internal interface TangemPayDetailIntents {
+ fun onRefreshSwipe(refreshState: ShowRefreshState)
+ fun onClickAddFunds()
+ fun onClickChangePin()
+ fun onClickFreezeCard()
+ fun onClickUnfreezeCard()
+ fun onClickTermsAndLimits()
+}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
index 6bfcbb7147..a102748888 100644
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
+++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
@@ -6,6 +6,7 @@ import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.navigation.Router
+import com.tangem.features.tangempay.TangemPayConstants
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.pay.repository.OnboardingRepository
import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase
@@ -81,7 +82,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
}
private fun onTermsClick() {
- urlOpener.openUrl("https://tangem.com/docs/en/tangem-visa-tariffs.pdf")
+ urlOpener.openUrl(TangemPayConstants.TERMS_AND_LIMITS_LINK)
}
private fun onGetCardClick() {