Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-17 18:30:45 +01:00
parent 328ced0518
commit 94155919f7
6 changed files with 41 additions and 43 deletions

View file

@ -135,7 +135,7 @@ class MoonPayService(
.appendQueryParameter("apiKey", apiKey)
.appendQueryParameter("baseCurrencyCode", moonpayCurrency.currencyCode.uppercase())
.appendQueryParameter("refundWalletAddress", walletAddress)
.appendQueryParameter("redirectURL", "tangem://redirect_sell")
.appendQueryParameter("redirectURL", "tangem://redirect_sell?currency_id=${cryptoCurrency.id.value}")
if (isDarkTheme) uri.appendQueryParameter("theme", "dark")

View file

@ -11,6 +11,7 @@ class SellCurrencyDeepLink(val onReceive: (data: Data) -> Unit) : DeepLink {
transactionId = params["transactionId"] ?: return,
baseCurrencyAmount = params["baseCurrencyAmount"] ?: return,
depositWalletAddress = params["depositWalletAddress"] ?: return,
currencyId = params["currency_id"] ?: return,
depositWalletAddressTag = params["depositWalletAddressTag"],
)
@ -21,6 +22,7 @@ class SellCurrencyDeepLink(val onReceive: (data: Data) -> Unit) : DeepLink {
val transactionId: String,
val baseCurrencyAmount: String,
val depositWalletAddress: String,
val currencyId: String,
val depositWalletAddressTag: String?,
)
}

View file

@ -184,8 +184,9 @@ sealed class CryptoCurrency : Parcelable {
}
private companion object {
// should use delimiters that could be used in URL not like path or query delimiters
const val PREFIX_DELIMITER = '_'
const val SUFFIX_DELIMITER = '#'
const val SUFFIX_DELIMITER = ';'
const val DERIVATION_PATH_DELIMITER = 'd'
}
}

View file

@ -10,7 +10,6 @@ import com.tangem.blockchain.common.address.AddressType
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.deeplink.DeepLinksRegistry
import com.tangem.core.deeplink.global.BuyCurrencyDeepLink
import com.tangem.core.deeplink.global.SellCurrencyDeepLink
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.core.ui.components.transactions.state.TxHistoryState
import com.tangem.core.ui.extensions.resourceReference
@ -165,7 +164,6 @@ internal class TokenDetailsViewModel @Inject constructor(
viewModel = this,
deepLinks = listOf(
BuyCurrencyDeepLink(::onBuyCurrencyDeepLink),
SellCurrencyDeepLink(::onSellCurrencyDeepLink),
),
)
}
@ -175,20 +173,6 @@ internal class TokenDetailsViewModel @Inject constructor(
analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol))
}
private fun onSellCurrencyDeepLink(data: SellCurrencyDeepLink.Data) {
sendCurrency(
status = cryptoCurrencyStatus ?: return,
transactionInfo = data.let {
TransactionInfo(
transactionId = it.transactionId,
destinationAddress = it.depositWalletAddress,
amount = it.baseCurrencyAmount,
tag = it.depositWalletAddressTag,
)
},
)
}
override fun onCreate(owner: LifecycleOwner) {
analyticsEventsHandler.send(
event = TokenScreenAnalyticsEvent.DetailsScreenOpened(token = cryptoCurrency.symbol),

View file

@ -8,16 +8,14 @@ import com.tangem.core.deeplink.DeepLinksRegistry
import com.tangem.core.deeplink.global.BuyCurrencyDeepLink
import com.tangem.core.deeplink.global.SellCurrencyDeepLink
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.GetCryptoCurrencyStatusSyncUseCase
import com.tangem.domain.tokens.GetCryptoCurrencyUseCase
import com.tangem.domain.tokens.GetFeePaidCryptoCurrencyStatusSyncUseCase
import com.tangem.domain.tokens.GetNetworkCoinStatusUseCase
import com.tangem.domain.tokens.*
import com.tangem.domain.tokens.legacy.TradeCryptoAction
import com.tangem.domain.tokens.legacy.TradeCryptoAction.TransactionInfo
import com.tangem.domain.tokens.model.CryptoCurrency
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.models.analytics.TokenScreenAnalyticsEvent
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
@ -29,23 +27,20 @@ internal class WalletDeepLinksHandler @Inject constructor(
private val analyticsEventHandler: AnalyticsEventHandler,
private val getCryptoCurrencyUseCase: GetCryptoCurrencyUseCase,
private val getCryptoCurrencyStatusSyncUseCase: GetCryptoCurrencyStatusSyncUseCase,
private val getCryptoCurrencyStatusesSyncUseCase: GetCryptoCurrencyStatusesSyncUseCase,
private val getFeePaidCryptoCurrencyStatusSyncUseCase: GetFeePaidCryptoCurrencyStatusSyncUseCase,
private val getNetworkCoinStatusUseCase: GetNetworkCoinStatusUseCase,
private val reduxStateHolder: ReduxStateHolder,
) {
private var deepLinks: List<DeepLink> = emptyList()
private var deepLinksMap = mutableMapOf<UserWalletId, List<DeepLink>>()
fun registerForSingleCurrencyWallets(viewModel: ViewModel, userWallet: UserWallet) {
if (userWallet.isMultiCurrency) {
deepLinksRegistry.unregister(deepLinks)
} else {
if (deepLinks.isEmpty()) {
deepLinks = getDeepLinks(userWallet, viewModel.viewModelScope)
}
deepLinksRegistry.register(deepLinks)
fun registerForWallet(viewModel: ViewModel, userWallet: UserWallet) {
val deepLinks = deepLinksMap.getOrPut(userWallet.walletId) {
getDeepLinks(userWallet, viewModel.viewModelScope)
}
deepLinksRegistry.unregisterByIds(deepLinks.map { it.id })
deepLinksRegistry.register(deepLinks)
viewModel.addCloseable {
deepLinksRegistry.unregister(deepLinks)
@ -60,20 +55,23 @@ internal class WalletDeepLinksHandler @Inject constructor(
}
},
)
val buyCurrencyDeepLink = BuyCurrencyDeepLink(
onReceive = {
scope.launch {
onBuyCurrencyDeepLink(userWallet)
}
},
)
return listOf(sellCurrencyDeepLink, buyCurrencyDeepLink)
return buildList {
add(sellCurrencyDeepLink)
if (!userWallet.isMultiCurrency) {
add(
BuyCurrencyDeepLink(
onReceive = {
scope.launch { onBuyCurrencyDeepLink(userWallet) }
},
),
)
}
}
}
private suspend fun onSellCurrencyDeepLink(userWallet: UserWallet, data: SellCurrencyDeepLink.Data) {
val cryptoCurrencyStatus = getCryptoCurrencyStatusSyncUseCase(userWallet.walletId)
.getOrNull() ?: return
val cryptoCurrencyStatus = findCryptoCurrencyStatus(userWallet, data.currencyId) ?: return
val feeCurrencyStatus = getFeePaidCryptoCurrencyStatusSyncUseCase(
userWallet.walletId,
cryptoCurrencyStatus,
@ -110,6 +108,19 @@ internal class WalletDeepLinksHandler @Inject constructor(
analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol))
}
private suspend fun findCryptoCurrencyStatus(
userWallet: UserWallet,
currencyIdValue: String,
): CryptoCurrencyStatus? {
return if (userWallet.isMultiCurrency) {
getCryptoCurrencyStatusesSyncUseCase(userWallet.walletId).getOrNull()?.let { currencies ->
currencies.find { currencyIdValue == it.currency.id.value }
}
} else {
getCryptoCurrencyStatusSyncUseCase(userWallet.walletId).getOrNull()
}
}
private fun sendCoin(
userWallet: UserWallet,
cryptoCurrencyStatus: CryptoCurrencyStatus,

View file

@ -154,7 +154,7 @@ internal class WalletViewModel @Inject constructor(
selectedWalletAnalyticsSender.send(selectedWallet)
}
walletDeepLinksHandler.registerForSingleCurrencyWallets(
walletDeepLinksHandler.registerForWallet(
viewModel = this,
userWallet = selectedWallet,
)