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() {