Updated on 2026-08-14
This commit is contained in:
parent
f1797da7ed
commit
03d40e8a3d
19 changed files with 48 additions and 45 deletions
|
|
@ -208,7 +208,7 @@ internal class ChildFactory @Inject constructor(
|
|||
is AppRoute.OnrampSuccess -> {
|
||||
route.asComponentChild(
|
||||
contextProvider = contextProvider(route, contextFactory),
|
||||
params = OnrampSuccessComponent.Params(route.txId),
|
||||
params = OnrampSuccessComponent.Params(route.externalTxId),
|
||||
componentFactory = onrampSuccessComponentFactory,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,8 +306,8 @@ sealed class AppRoute(val path: String) : Route {
|
|||
|
||||
@Serializable
|
||||
data class OnrampSuccess(
|
||||
val txId: String,
|
||||
) : AppRoute(path = "/onramp/success/$txId"), RouteBundleParams {
|
||||
val externalTxId: String,
|
||||
) : AppRoute(path = "/onramp/success/$externalTxId"), RouteBundleParams {
|
||||
override fun getBundle(): Bundle = bundle(serializer())
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.tangem.core.deeplink.DeepLink
|
|||
|
||||
class BuyCurrencyDeepLink(
|
||||
isOnrampFeatureEnabled: Boolean,
|
||||
val onReceive: (txId: String) -> Unit,
|
||||
val onReceive: (externalTxId: String) -> Unit,
|
||||
) : DeepLink {
|
||||
|
||||
override val uri: String = if (isOnrampFeatureEnabled) {
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ internal class DefaultOnrampTransactionRepository(
|
|||
)?.map(transactionConverter::convert) ?: mutableSetOf()
|
||||
|
||||
val updated = stored.toMutableSet()
|
||||
.addOrReplace(transaction) { it.txId == transaction.txId }
|
||||
.addOrReplace(transaction) { it.externalTxId == transaction.externalTxId }
|
||||
.map(transactionConverter::convertBack)
|
||||
.toSet()
|
||||
|
||||
|
|
@ -44,12 +44,12 @@ internal class DefaultOnrampTransactionRepository(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun getTransactionById(txId: String): OnrampTransaction? = withContext(dispatchers.io) {
|
||||
override suspend fun getTransactionById(externalTxId: String): OnrampTransaction? = withContext(dispatchers.io) {
|
||||
val stored = appPreferencesStore.getObjectSetSync<OnrampTransactionDTO>(
|
||||
PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
||||
).map(transactionConverter::convert)
|
||||
|
||||
stored.firstOrNull { it.txId == txId }
|
||||
stored.firstOrNull { it.externalTxId == externalTxId }
|
||||
}
|
||||
|
||||
override fun getTransactions(
|
||||
|
|
@ -63,13 +63,13 @@ internal class DefaultOnrampTransactionRepository(
|
|||
}.map(transactionConverter::convert)
|
||||
}
|
||||
|
||||
override suspend fun updateTransactionStatus(txId: String, status: OnrampStatus.Status) =
|
||||
override suspend fun updateTransactionStatus(externalTxId: String, status: OnrampStatus.Status) =
|
||||
withContext(dispatchers.io) {
|
||||
val updatedTx = getTransactionById(txId)?.copy(status = status) ?: return@withContext
|
||||
val updatedTx = getTransactionById(externalTxId)?.copy(status = status) ?: return@withContext
|
||||
storeTransaction(updatedTx)
|
||||
}
|
||||
|
||||
override suspend fun removeTransaction(txId: String) {
|
||||
override suspend fun removeTransaction(externalTxId: String) {
|
||||
withContext(dispatchers.io) {
|
||||
appPreferencesStore.editData { mutablePreferences ->
|
||||
runCatching {
|
||||
|
|
@ -77,7 +77,7 @@ internal class DefaultOnrampTransactionRepository(
|
|||
PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
||||
)?.toMutableSet()
|
||||
|
||||
stored?.removeIf { it.txId == txId }
|
||||
stored?.removeIf { it.externalTxId == externalTxId }
|
||||
|
||||
mutablePreferences.setObjectSet<OnrampTransactionDTO>(
|
||||
key = PreferencesKeys.ONRAMP_TRANSACTIONS_STATUSES_KEY,
|
||||
|
|
|
|||
|
|
@ -11,9 +11,9 @@ class GetOnrampStatusUseCase(
|
|||
private val errorResolver: OnrampErrorResolver,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(txId: String): Either<OnrampError, OnrampStatus> {
|
||||
suspend operator fun invoke(externalTxId: String): Either<OnrampError, OnrampStatus> {
|
||||
return Either.catch {
|
||||
onrampRepository.getStatus(txId)
|
||||
onrampRepository.getStatus(externalTxId)
|
||||
}.mapLeft {
|
||||
errorResolver.resolve(it)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ class GetOnrampTransactionUseCase(
|
|||
private val onrampTransactionRepository: OnrampTransactionRepository,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(txId: String): Either<OnrampError, OnrampTransaction> {
|
||||
suspend operator fun invoke(externalTxId: String): Either<OnrampError, OnrampTransaction> {
|
||||
return Either.catch {
|
||||
requireNotNull(
|
||||
onrampTransactionRepository.getTransactionById(txId),
|
||||
onrampTransactionRepository.getTransactionById(externalTxId),
|
||||
)
|
||||
}.mapLeft {
|
||||
OnrampError.UnknownError
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.tangem.domain.onramp
|
||||
|
||||
import arrow.core.Either
|
||||
import arrow.core.left
|
||||
import com.tangem.domain.onramp.model.OnrampError
|
||||
import com.tangem.domain.onramp.repositories.OnrampTransactionRepository
|
||||
|
||||
|
|
@ -8,9 +9,11 @@ class OnrampRemoveTransactionUseCase(
|
|||
private val onrampTransactionRepository: OnrampTransactionRepository,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(txId: String): Either<OnrampError, Unit> {
|
||||
suspend operator fun invoke(externalTxId: String?): Either<OnrampError, Unit> {
|
||||
if (externalTxId == null) return OnrampError.UnknownError.left()
|
||||
|
||||
return Either.catch {
|
||||
onrampTransactionRepository.removeTransaction(txId)
|
||||
onrampTransactionRepository.removeTransaction(externalTxId)
|
||||
}.mapLeft {
|
||||
OnrampError.UnknownError
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ class OnrampUpdateTransactionStatusUseCase(
|
|||
private val onrampTransactionRepository: OnrampTransactionRepository,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(txId: String, status: OnrampStatus.Status) = Either.catch {
|
||||
onrampTransactionRepository.updateTransactionStatus(txId = txId, status = status)
|
||||
suspend operator fun invoke(externalTxId: String, status: OnrampStatus.Status) = Either.catch {
|
||||
onrampTransactionRepository.updateTransactionStatus(externalTxId = externalTxId, status = status)
|
||||
}
|
||||
}
|
||||
|
|
@ -10,11 +10,11 @@ interface OnrampTransactionRepository {
|
|||
|
||||
suspend fun storeTransaction(transaction: OnrampTransaction)
|
||||
|
||||
suspend fun getTransactionById(txId: String): OnrampTransaction?
|
||||
suspend fun getTransactionById(externalTxId: String): OnrampTransaction?
|
||||
|
||||
fun getTransactions(userWalletId: UserWalletId, cryptoCurrencyId: CryptoCurrency.ID): Flow<List<OnrampTransaction>>
|
||||
|
||||
suspend fun updateTransactionStatus(txId: String, status: OnrampStatus.Status)
|
||||
suspend fun updateTransactionStatus(externalTxId: String, status: OnrampStatus.Status)
|
||||
|
||||
suspend fun removeTransaction(txId: String)
|
||||
suspend fun removeTransaction(externalTxId: String)
|
||||
}
|
||||
|
|
@ -5,7 +5,7 @@ import com.tangem.core.ui.decompose.ComposableContentComponent
|
|||
|
||||
interface OnrampSuccessComponent : ComposableContentComponent {
|
||||
|
||||
data class Params(val txId: String)
|
||||
data class Params(val externalTxId: String)
|
||||
|
||||
interface Factory : ComponentFactory<Params, OnrampSuccessComponent>
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
|
|||
|
||||
private fun loadData() {
|
||||
modelScope.launch {
|
||||
getOnrampTransactionUseCase(txId = params.txId)
|
||||
getOnrampTransactionUseCase(externalTxId = params.externalTxId)
|
||||
.fold(
|
||||
ifLeft = {
|
||||
Timber.e(it.toString())
|
||||
|
|
@ -72,7 +72,7 @@ internal class OnrampSuccessComponentModel @Inject constructor(
|
|||
transaction.toCurrencyId,
|
||||
).getOrElse { error("Crypto currency not found") }
|
||||
|
||||
getOnrampStatusUseCase(txId = params.txId)
|
||||
getOnrampStatusUseCase(externalTxId = params.externalTxId)
|
||||
.fold(
|
||||
ifLeft = {
|
||||
Timber.e(it.toString())
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ internal class DefaultTokenDetailsRouter(
|
|||
)
|
||||
}
|
||||
|
||||
override fun openOnrampSuccess(txId: String) {
|
||||
router.push(AppRoute.OnrampSuccess(txId))
|
||||
override fun openOnrampSuccess(externalTxId: String) {
|
||||
router.push(AppRoute.OnrampSuccess(externalTxId))
|
||||
}
|
||||
}
|
||||
|
|
@ -20,5 +20,5 @@ internal interface InnerTokenDetailsRouter : TokenDetailsRouter {
|
|||
|
||||
fun openStaking(userWalletId: UserWalletId, cryptoCurrency: CryptoCurrency, yield: Yield)
|
||||
|
||||
fun openOnrampSuccess(txId: String)
|
||||
fun openOnrampSuccess(externalTxId: String)
|
||||
}
|
||||
|
|
@ -74,7 +74,7 @@ internal class OnrampStatusFactory @AssistedInject constructor(
|
|||
val selectedTx = bottomSheetConfig.value as? ExpressTransactionStateUM.OnrampUM ?: return
|
||||
|
||||
if (selectedTx.activeStatus.isTerminal) {
|
||||
onrampRemoveTransactionUseCase(txId = selectedTx.info.txId)
|
||||
onrampRemoveTransactionUseCase(externalTxId = selectedTx.info.txExternalId)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -97,14 +97,14 @@ internal class OnrampStatusFactory @AssistedInject constructor(
|
|||
|
||||
private suspend fun List<ExpressTransactionStateUM.OnrampUM>.clearHiddenTerminal() {
|
||||
this.filter { it.activeStatus.isHidden && it.activeStatus.isTerminal }
|
||||
.forEach { onrampRemoveTransactionUseCase(txId = it.info.txId) }
|
||||
.forEach { onrampRemoveTransactionUseCase(externalTxId = it.info.txExternalId) }
|
||||
}
|
||||
|
||||
private suspend fun sendStatusUpdateAnalytics(
|
||||
onrampTx: ExpressTransactionStateUM.OnrampUM,
|
||||
statusModel: OnrampStatus,
|
||||
) {
|
||||
val txId = statusModel.txId
|
||||
val externalTxId = statusModel.externalTxId
|
||||
val status = toAnalyticStatus(statusModel.status) ?: return
|
||||
|
||||
if (statusModel.status != onrampTx.activeStatus) {
|
||||
|
|
@ -116,7 +116,7 @@ internal class OnrampStatusFactory @AssistedInject constructor(
|
|||
fiatCurrency = onrampTx.fromCurrencyCode,
|
||||
),
|
||||
)
|
||||
onrampUpdateTransactionStatusUseCase(txId, statusModel.status)
|
||||
onrampUpdateTransactionStatusUseCase(externalTxId = externalTxId, statusModel.status)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -198,9 +198,9 @@ internal class TokenDetailsViewModel @Inject constructor(
|
|||
userWallet = getUserWalletUseCase(userWalletId).getOrNull() ?: error("UserWallet not found")
|
||||
}
|
||||
|
||||
private fun onBuyCurrencyDeepLink(txId: String) {
|
||||
private fun onBuyCurrencyDeepLink(externalTxId: String) {
|
||||
if (onrampFeatureToggles.isFeatureEnabled) {
|
||||
router.openOnrampSuccess(txId)
|
||||
router.openOnrampSuccess(externalTxId)
|
||||
} else {
|
||||
val currency = cryptoCurrencyStatus?.currency ?: return
|
||||
analyticsEventsHandler.send(TokenScreenAnalyticsEvent.Bought(currency.symbol))
|
||||
|
|
|
|||
|
|
@ -66,8 +66,8 @@ internal class WalletDeepLinksHandler @Inject constructor(
|
|||
add(
|
||||
BuyCurrencyDeepLink(
|
||||
isOnrampFeatureEnabled = onrampFeatureToggles.isFeatureEnabled,
|
||||
onReceive = { txId ->
|
||||
scope.launch { onBuyCurrencyDeepLink(txId, userWallet) }
|
||||
onReceive = { externalTxId ->
|
||||
scope.launch { onBuyCurrencyDeepLink(externalTxId, userWallet) }
|
||||
},
|
||||
),
|
||||
)
|
||||
|
|
@ -107,9 +107,9 @@ internal class WalletDeepLinksHandler @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
private suspend fun onBuyCurrencyDeepLink(txId: String, userWallet: UserWallet) {
|
||||
private suspend fun onBuyCurrencyDeepLink(externalTxId: String, userWallet: UserWallet) {
|
||||
if (onrampFeatureToggles.isFeatureEnabled) {
|
||||
clickIntents.onOnrampSuccessClick(txId)
|
||||
clickIntents.onOnrampSuccessClick(externalTxId)
|
||||
} else {
|
||||
val cryptoCurrency = getCryptoCurrencyUseCase(userWallet.walletId).getOrNull() ?: return
|
||||
analyticsEventHandler.send(TokenScreenAnalyticsEvent.Bought(cryptoCurrency.symbol))
|
||||
|
|
|
|||
|
|
@ -129,8 +129,8 @@ internal class DefaultWalletRouter(
|
|||
}
|
||||
}
|
||||
|
||||
override fun openOnrampSuccessScreen(txId: String) {
|
||||
router.push(AppRoute.OnrampSuccess(txId))
|
||||
override fun openOnrampSuccessScreen(externalTxId: String) {
|
||||
router.push(AppRoute.OnrampSuccess(externalTxId))
|
||||
}
|
||||
|
||||
override fun openUrl(url: String) {
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ internal interface InnerWalletRouter : WalletRouter {
|
|||
/** Open onboarding screen */
|
||||
fun openOnboardingScreen(scanResponse: ScanResponse, continueBackup: Boolean = false)
|
||||
|
||||
/** Open onramp success screen for [txId] */
|
||||
fun openOnrampSuccessScreen(txId: String)
|
||||
/** Open onramp success screen for [externalTxId] */
|
||||
fun openOnrampSuccessScreen(externalTxId: String)
|
||||
|
||||
/** Open transaction history website by [url] */
|
||||
fun openUrl(url: String)
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ internal interface WalletContentClickIntents {
|
|||
|
||||
fun onOrganizeTokensClick()
|
||||
|
||||
fun onOnrampSuccessClick(txId: String)
|
||||
fun onOnrampSuccessClick(externalTxId: String)
|
||||
|
||||
fun onDismissMarketsOnboarding()
|
||||
|
||||
|
|
@ -99,8 +99,8 @@ internal class WalletContentClickIntentsImplementor @Inject constructor(
|
|||
router.openOrganizeTokensScreen(userWalletId = stateHolder.getSelectedWalletId())
|
||||
}
|
||||
|
||||
override fun onOnrampSuccessClick(txId: String) {
|
||||
router.openOnrampSuccessScreen(txId = txId)
|
||||
override fun onOnrampSuccessClick(externalTxId: String) {
|
||||
router.openOnrampSuccessScreen(externalTxId = externalTxId)
|
||||
}
|
||||
|
||||
override fun onDismissMarketsOnboarding() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue