Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-10 14:30:13 +05:00
commit b31c2a27ee
8 changed files with 34 additions and 25 deletions

View file

@ -6,6 +6,7 @@ import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.datasource.local.walletmanager.WalletManagersStore
import com.tangem.domain.walletmanager.DefaultWalletManagersFacade
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -23,11 +24,13 @@ internal object WalletManagersFacadeModule {
userWalletsStore: UserWalletsStore,
assetLoader: AssetLoader,
blockchainSDKFactory: BlockchainSDKFactory,
dispatchers: CoroutineDispatcherProvider,
): WalletManagersFacade {
return DefaultWalletManagersFacade(
walletManagersStore = walletManagersStore,
userWalletsStore = userWalletsStore,
assetLoader = assetLoader,
dispatchers = dispatchers,
blockchainSDKFactory = blockchainSDKFactory,
)
}

View file

@ -266,7 +266,7 @@ internal class DefaultCurrenciesRepository(
override suspend fun getMultiCurrencyWalletCurrenciesSync(
userWalletId: UserWalletId,
refresh: Boolean,
): List<CryptoCurrency> {
): List<CryptoCurrency> = withContext(dispatchers.io) {
val userWallet = getUserWallet(userWalletId)
ensureIsCorrectUserWallet(userWallet, isMultiCurrencyWalletExpected = true)
@ -276,7 +276,7 @@ internal class DefaultCurrenciesRepository(
"Unable to find tokens response for user wallet with provided ID: $userWalletId"
}
return responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse)
responseCurrenciesFactory.createCurrencies(storedTokens, userWallet.scanResponse)
}
override suspend fun getMultiCurrencyWalletCurrency(

View file

@ -106,15 +106,15 @@ internal class DefaultNetworksRepository(
override suspend fun getNetworkAddresses(
userWalletId: UserWalletId,
network: Network,
): List<CryptoCurrencyAddress> {
): List<CryptoCurrencyAddress> = withContext(dispatchers.io) {
// Get list of currencies matching [network]
val currencies = getCurrencies(userWalletId)
.filter { currency -> network.id == currency.network.id }
// There is no currencies matching given [networks] in [userWalletId]
if (currencies.toList().isEmpty()) return emptyList()
if (currencies.toList().isEmpty()) return@withContext emptyList()
return currencies.toList().map { currency ->
currencies.toList().map { currency ->
CryptoCurrencyAddress(
cryptoCurrency = currency,
address = walletManagersFacade.getAddresses(userWalletId, currency.network)

View file

@ -67,7 +67,7 @@ internal class DefaultTransactionRepository(
isSwap: Boolean,
txExtras: TransactionExtras?,
hash: String?,
): Result<Unit> {
): Result<Unit> = withContext(coroutineDispatcherProvider.io) {
val blockchain = Blockchain.fromId(network.id.value)
val walletManager = walletManagersStore.getSyncOrNull(
userWalletId = userWalletId,
@ -77,7 +77,7 @@ internal class DefaultTransactionRepository(
val validator = walletManager as? TransactionValidator
return if (validator != null) {
if (validator != null) {
val transaction = walletManager.createTransactionInternal(
amount = amount,
fee = fee ?: Fee.Common(amount = amount),

View file

@ -6,6 +6,7 @@ import com.tangem.datasource.local.txhistory.TxHistoryItemsStore
import com.tangem.datasource.local.userwallet.UserWalletsStore
import com.tangem.domain.txhistory.repository.TxHistoryRepository
import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -23,10 +24,12 @@ internal object TxHistoryDataModule {
walletManagersFacade: WalletManagersFacade,
userWalletsStore: UserWalletsStore,
txHistoryItemsStore: TxHistoryItemsStore,
dispatchers: CoroutineDispatcherProvider,
): TxHistoryRepository = DefaultTxHistoryRepository(
cacheRegistry,
walletManagersFacade,
userWalletsStore,
txHistoryItemsStore,
dispatchers,
)
}

View file

@ -20,7 +20,9 @@ import com.tangem.domain.walletmanager.WalletManagersFacade
import com.tangem.domain.walletmanager.utils.SdkPageConverter
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import timber.log.Timber
class DefaultTxHistoryRepository(
@ -28,6 +30,7 @@ class DefaultTxHistoryRepository(
private val walletManagersFacade: WalletManagersFacade,
private val userWalletsStore: UserWalletsStore,
private val txHistoryItemsStore: TxHistoryItemsStore,
private val dispatchers: CoroutineDispatcherProvider,
) : TxHistoryRepository {
private val sdkPageConverter by lazy { SdkPageConverter() }
@ -96,8 +99,8 @@ class DefaultTxHistoryRepository(
currency: CryptoCurrency,
pageSize: Int,
refresh: Boolean,
): List<TxHistoryItem> {
return try {
): List<TxHistoryItem> = withContext(dispatchers.io) {
try {
cacheRegistry.invokeOnExpire(
key = getTxHistoryPageKey(currency, userWalletId, Page.Initial),
skipCache = refresh,

View file

@ -36,9 +36,11 @@ import com.tangem.domain.walletmanager.utils.*
import com.tangem.domain.walletmanager.utils.WalletManagerFactory
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.math.BigDecimal
import java.util.EnumSet
@ -50,6 +52,7 @@ class DefaultWalletManagersFacade(
private val walletManagersStore: WalletManagersStore,
private val userWalletsStore: UserWalletsStore,
private val assetLoader: AssetLoader,
private val dispatchers: CoroutineDispatcherProvider,
blockchainSDKFactory: BlockchainSDKFactory,
) : WalletManagersFacade {
@ -452,12 +455,12 @@ class DefaultWalletManagersFacade(
destination: String,
userWalletId: UserWalletId,
network: Network,
): Result<TransactionFee>? {
): Result<TransactionFee>? = withContext(dispatchers.io) {
val walletManager = getOrCreateWalletManager(
userWalletId = userWalletId,
network = network,
)
return (walletManager as? TransactionSender)?.getFee(
(walletManager as? TransactionSender)?.getFee(
amount = amount,
destination = destination,
)

View file

@ -30,16 +30,14 @@ import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.tokens.repository.CurrencyChecksRepository
import com.tangem.domain.tokens.utils.convertToAmount
import com.tangem.domain.transaction.error.GetFeeError
import com.tangem.domain.transaction.error.ValidateAddressError
import com.tangem.domain.transaction.usecase.*
import com.tangem.domain.txhistory.usecase.GetExplorerTransactionUrlUseCase
import com.tangem.domain.txhistory.usecase.GetFixedTxHistoryItemsUseCase
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.transaction.error.ValidateAddressError
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.domain.wallets.usecase.GetWalletsUseCase
import com.tangem.domain.transaction.usecase.ValidateWalletAddressUseCase
import com.tangem.domain.transaction.usecase.ValidateWalletMemoUseCase
import com.tangem.features.send.api.navigation.SendRouter
import com.tangem.features.send.impl.navigation.InnerSendRouter
import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource
@ -247,7 +245,7 @@ internal class SendViewModel @Inject constructor(
}
private fun subscribeOnCurrencyStatusUpdates() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
getUserWalletUseCase(userWalletId).fold(
ifRight = { wallet ->
userWallet = wallet
@ -311,7 +309,7 @@ internal class SendViewModel @Inject constructor(
}
private fun getTapHelpPreviewAvailability() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
isTapHelpPreviewEnabled = isSendTapHelpEnabledUseCase().getOrElse { false }
}
}
@ -393,18 +391,17 @@ internal class SendViewModel @Inject constructor(
private fun getWalletsAndRecent() {
getUserWallets()
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
getTxHistory()
}
}
private fun getUserWallets() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
runCatching {
waitForDelay(delay = RECENT_LOAD_DELAY) {
getWalletsUseCase.invokeSync()
.toAvailableWallets()
.orEmpty()
}
}.onSuccess { result ->
userWallets = result
@ -560,7 +557,7 @@ internal class SendViewModel @Inject constructor(
}
private fun cancelFeeRequest() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
feeJobHolder.cancel()
}
}
@ -695,7 +692,7 @@ internal class SendViewModel @Inject constructor(
}
private fun loadFee() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
val isShowStatus = uiState.feeState?.fee == null
if (isShowStatus) {
uiState = feeStateFactory.onFeeOnLoadingState()
@ -840,7 +837,7 @@ internal class SendViewModel @Inject constructor(
reduceAmountBy = uiState.sendState?.reduceAmountBy ?: BigDecimal.ZERO,
)
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
createTransactionUseCase(
amount = receivingAmount.convertToAmount(cryptoCurrency),
fee = fee,
@ -896,7 +893,7 @@ internal class SendViewModel @Inject constructor(
val receivingUserWallet = userWallets.firstOrNull { it.address == destinationAddress } ?: return
viewModelScope.launch(dispatchers.io) {
viewModelScope.launch {
addCryptoCurrenciesUseCase(
userWalletId = receivingUserWallet.userWalletId,
cryptoCurrency = cryptoCurrency,
@ -933,7 +930,7 @@ internal class SendViewModel @Inject constructor(
val noErrorNotifications = sendState.notifications.none { it is SendNotification.Error }
if (!isSuccess && noErrorNotifications) {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
val feeUpdatedState = callFeeUseCase()?.fold(
ifRight = {
uiState = stateFactory.getSendingStateUpdate(isSending = false)
@ -967,7 +964,7 @@ internal class SendViewModel @Inject constructor(
}
private fun setNeverToShowTapHelp() {
viewModelScope.launch(dispatchers.main) {
viewModelScope.launch {
neverShowTapHelpUseCase()
}
uiState = stateFactory.getHiddenTapHelpState()