From 95a1e6c76651694acdabd9478a775857cce2b417 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 9 Apr 2025 14:59:58 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/TransactionDomainModule.kt | 5 ++++ .../local/datastore/RuntimeSharedStore.kt | 12 ++++++--- .../usecase/SendTransactionUseCase.kt | 25 +++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt index a693b4963e..adc63cbd3d 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TransactionDomainModule.kt @@ -2,6 +2,7 @@ package com.tangem.tap.di.domain import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.demo.DemoConfig +import com.tangem.domain.networks.single.SingleNetworkStatusFetcher import com.tangem.domain.networks.single.SingleNetworkStatusSupplier import com.tangem.domain.tokens.TokensFeatureToggles import com.tangem.domain.tokens.repository.CurrenciesRepository @@ -35,12 +36,16 @@ internal object TransactionDomainModule { cardSdkConfigRepository: CardSdkConfigRepository, transactionRepository: TransactionRepository, walletManagersFacade: WalletManagersFacade, + singleNetworkStatusFetcher: SingleNetworkStatusFetcher, + tokensFeatureToggles: TokensFeatureToggles, ): SendTransactionUseCase { return SendTransactionUseCase( demoConfig = DemoConfig(), cardSdkConfigRepository = cardSdkConfigRepository, transactionRepository = transactionRepository, walletManagersFacade = walletManagersFacade, + singleNetworkStatusFetcher = singleNetworkStatusFetcher, + tokensFeatureToggles = tokensFeatureToggles, ) } diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/datastore/RuntimeSharedStore.kt b/core/datasource/src/main/java/com/tangem/datasource/local/datastore/RuntimeSharedStore.kt index 1636a37cd0..d32fa5215c 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/datastore/RuntimeSharedStore.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/datastore/RuntimeSharedStore.kt @@ -4,6 +4,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock /** * Runtime shared store @@ -42,6 +44,7 @@ interface RuntimeSharedStore { operator fun invoke(): RuntimeSharedStore = object : RuntimeSharedStore { private val flow = MutableSharedFlow(replay = 1) + private val updateMutex = Mutex() init { flow.tryEmit(value = null) @@ -58,10 +61,13 @@ interface RuntimeSharedStore { } override suspend fun update(default: T, function: (T) -> T) { - val storedData = flow.firstOrNull() ?: default - val updatedData = function(storedData) + // required to synchronize get (firstOrNull) and update (emit) operations + updateMutex.withLock { + val storedData = flow.firstOrNull() ?: default + val updatedData = function(storedData) - flow.emit(value = updatedData) + flow.emit(value = updatedData) + } } } } diff --git a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt index ba89fcc80f..15efbc7500 100644 --- a/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt +++ b/domain/transaction/src/main/java/com/tangem/domain/transaction/usecase/SendTransactionUseCase.kt @@ -12,12 +12,14 @@ import com.tangem.blockchain.extensions.Result import com.tangem.blockchain.network.ResultChecker import com.tangem.core.ui.format.bigdecimal.format import com.tangem.core.ui.format.bigdecimal.simple +import com.tangem.domain.card.models.TwinKey import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.common.TapWorkarounds.isStart2Coin import com.tangem.domain.common.TapWorkarounds.isTangemTwins import com.tangem.domain.demo.DemoConfig import com.tangem.domain.demo.DemoTransactionSender -import com.tangem.domain.card.models.TwinKey +import com.tangem.domain.networks.single.SingleNetworkStatusFetcher +import com.tangem.domain.tokens.TokensFeatureToggles import com.tangem.domain.tokens.model.Network import com.tangem.domain.transaction.TransactionRepository import com.tangem.domain.transaction.error.SendTransactionError @@ -30,6 +32,8 @@ class SendTransactionUseCase( private val cardSdkConfigRepository: CardSdkConfigRepository, private val transactionRepository: TransactionRepository, private val walletManagersFacade: WalletManagersFacade, + private val singleNetworkStatusFetcher: SingleNetworkStatusFetcher, + private val tokensFeatureToggles: TokensFeatureToggles, ) { suspend operator fun invoke( txsData: List, @@ -76,10 +80,21 @@ class SendTransactionUseCase( } cardSdkConfigRepository.setLinkedTerminal(linkedTerminal) - return sendResult.fold( - ifRight = { result -> result.hashes.right() }, - ifLeft = { it.left() }, - ) + return sendResult + .onRight { + if (tokensFeatureToggles.isNetworksLoadingRefactoringEnabled) { + singleNetworkStatusFetcher( + params = SingleNetworkStatusFetcher.Params( + userWalletId = userWallet.walletId, + network = network, + ), + ) + } + } + .fold( + ifRight = { result -> result.hashes.right() }, + ifLeft = { it.left() }, + ) } suspend operator fun invoke(