Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-27 14:04:49 +05:00
parent 1a1cce4e70
commit 12146c8981
11 changed files with 51 additions and 12 deletions

View file

@ -1,6 +1,7 @@
package com.tangem.tap.common.url
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent
@ -34,6 +35,8 @@ internal class CustomTabsUrlOpener : UrlOpener {
)
.build()
customTabsIntent.intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
customTabsIntent.launchUrl(context, Uri.parse(url))
}
}

View file

@ -2,11 +2,13 @@ package com.tangem.core.deeplink.global
import com.tangem.core.deeplink.DeepLink
class BuyCurrencyDeepLink(val onReceive: () -> Unit) : DeepLink {
class BuyCurrencyDeepLink(val onReceive: (txId: String) -> Unit) : DeepLink {
override val uri: String = "tangem://redirect?action=dismissBrowser"
override fun onReceive(params: Map<String, String>) {
onReceive()
onReceive(
params["txId"] ?: return,
)
}
}

View file

@ -93,5 +93,6 @@ dependencies {
implementation(projects.features.send.api)
implementation(projects.features.staking.api)
implementation(projects.features.markets.api)
implementation(projects.features.onramp.api)
}

View file

@ -48,4 +48,8 @@ internal class DefaultTokenDetailsRouter(
),
)
}
override fun openOnrampSuccess(txId: String) {
router.push(AppRoute.OnrampSuccess(txId))
}
}

View file

@ -19,4 +19,6 @@ internal interface InnerTokenDetailsRouter : TokenDetailsRouter {
fun openTokenDetails(userWalletId: UserWalletId, currency: CryptoCurrency)
fun openStaking(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, yield: Yield)
fun openOnrampSuccess(txId: String)
}

View file

@ -66,6 +66,7 @@ import com.tangem.feature.tokendetails.presentation.tokendetails.state.express.E
import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.TokenDetailsStateFactory
import com.tangem.feature.tokendetails.presentation.tokendetails.state.factory.express.ExpressStatusFactory
import com.tangem.feature.tokendetails.presentation.tokendetails.ui.components.express.ExpressStatusBottomSheetConfig
import com.tangem.features.onramp.OnrampFeatureToggles
import com.tangem.features.tokendetails.impl.R
import com.tangem.utils.Provider
import com.tangem.utils.coroutines.*
@ -111,6 +112,7 @@ internal class TokenDetailsViewModel @Inject constructor(
private val vibratorHapticManager: VibratorHapticManager,
private val clipboardManager: ClipboardManager,
expressStatusFactory: ExpressStatusFactory.Factory,
private val onrampFeatureToggles: OnrampFeatureToggles,
getUserWalletUseCase: GetUserWalletUseCase,
getStakingIntegrationIdUseCase: GetStakingIntegrationIdUseCase,
deepLinksRegistry: DeepLinksRegistry,
@ -193,10 +195,14 @@ internal class TokenDetailsViewModel @Inject constructor(
userWallet = getUserWalletUseCase(userWalletId).getOrNull() ?: error("UserWallet not found")
}
private fun onBuyCurrencyDeepLink() {
private fun onBuyCurrencyDeepLink(txId: String) {
if (onrampFeatureToggles.isFeatureEnabled) {
router.openOnrampSuccess(txId)
} else {
val currency = cryptoCurrencyStatus?.currency ?: return
analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol))
}
}
override fun onCreate(owner: LifecycleOwner) {
analyticsEventsHandler.send(

View file

@ -94,6 +94,7 @@ dependencies {
implementation(projects.features.details.api)
implementation(projects.features.pushNotifications.api)
implementation(projects.features.markets.api)
implementation(projects.features.onramp.api)
/** Common modules */
implementation(projects.common.ui)

View file

@ -16,6 +16,8 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.model.analytics.TokenScreenAnalyticsEvent
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.presentation.wallet.viewmodels.intents.WalletClickIntents
import com.tangem.features.onramp.OnrampFeatureToggles
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
@ -31,6 +33,8 @@ internal class WalletDeepLinksHandler @Inject constructor(
private val getFeePaidCryptoCurrencyStatusSyncUseCase: GetFeePaidCryptoCurrencyStatusSyncUseCase,
private val getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase,
private val reduxStateHolder: ReduxStateHolder,
private val clickIntents: WalletClickIntents,
private val onrampFeatureToggles: OnrampFeatureToggles,
) {
private var deepLinksMap = mutableMapOf<UserWalletId, List<DeepLink>>()
@ -58,11 +62,11 @@ internal class WalletDeepLinksHandler @Inject constructor(
return buildList {
add(sellCurrencyDeepLink)
if (!userWallet.isMultiCurrency) {
if (onrampFeatureToggles.isFeatureEnabled || !userWallet.isMultiCurrency) {
add(
BuyCurrencyDeepLink(
onReceive = {
scope.launch { onBuyCurrencyDeepLink(userWallet) }
onReceive = { txId ->
scope.launch { onBuyCurrencyDeepLink(txId, userWallet) }
},
),
)
@ -102,11 +106,14 @@ internal class WalletDeepLinksHandler @Inject constructor(
}
}
private suspend fun onBuyCurrencyDeepLink(userWallet: UserWallet) {
private suspend fun onBuyCurrencyDeepLink(txId: String, userWallet: UserWallet) {
if (onrampFeatureToggles.isFeatureEnabled) {
clickIntents.onOnrampSuccessClick(txId)
} else {
val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrNull() ?: return
analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol))
}
}
private suspend fun findCryptoCurrencyStatus(
userWallet: UserWallet,

View file

@ -112,6 +112,10 @@ internal class DefaultWalletRouter(
)
}
override fun openOnrampSuccessScreen(txId: String) {
router.push(AppRoute.OnrampSuccess(txId))
}
override fun openUrl(url: String) {
urlOpener.openUrl(url)
}

View file

@ -38,6 +38,9 @@ internal interface InnerWalletRouter : WalletRouter {
/** Open onboarding screen */
fun openOnboardingScreen()
/** Open onramp success screen for [txId] */
fun openOnrampSuccessScreen(txId: String)
/** Open transaction history website by [url] */
fun openUrl(url: String)

View file

@ -34,6 +34,8 @@ internal interface WalletContentClickIntents {
fun onOrganizeTokensClick()
fun onOnrampSuccessClick(txId: String)
fun onDismissMarketsOnboarding()
fun onTokenItemClick(currencyStatus: CryptoCurrencyStatus)
@ -97,6 +99,10 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
router.openOrganizeTokensScreen(userWalletId = stateHolder.getSelectedWalletId())
}
override fun onOnrampSuccessClick(txId: String) {
router.openOnrampSuccessScreen(txId = txId)
}
override fun onDismissMarketsOnboarding() {
stateHolder.update { it.copy(showMarketsOnboarding = false) }
viewModelScope.launch {