From d74f3191bbfb36e9bfa989fd0e347b84b3bf2b6e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 8 Dec 2023 18:05:57 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/feature/swap/SwapRepositoryImpl.kt | 2 +- .../swap/converters/SwapPairInfoConverter.kt | 22 ++++++++++++++++--- .../feature/swap/domain/SwapInteractorImpl.kt | 12 +++++----- .../feature/swap/domain/SwapRepository.kt | 2 +- .../models/domain/PairsWithProviders.kt | 6 +++++ .../models/ui/TokensDataStateExpress.kt | 3 +++ .../feature/swap/viewmodels/SwapViewModel.kt | 13 +++++------ 7 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/PairsWithProviders.kt diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index 90358d75df..9e41c08329 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -60,7 +60,7 @@ internal class SwapRepositoryImpl @Inject constructor( override suspend fun getPairs( initialCurrency: LeastTokenInfo, currencyList: List, - ): List { + ): PairsWithProviders { return withContext(coroutineDispatcher.io) { val initial = NetworkLeastTokenInfo( contractAddress = initialCurrency.contractAddress, diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt index ff86a7e049..4ea0faf9cd 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/converters/SwapPairInfoConverter.kt @@ -2,18 +2,20 @@ package com.tangem.feature.swap.converters import com.tangem.datasource.api.express.models.response.* import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo +import com.tangem.feature.swap.domain.models.domain.PairsWithProviders +import com.tangem.feature.swap.domain.models.domain.SwapProvider import com.tangem.utils.converter.Converter import com.tangem.feature.swap.domain.models.domain.ExchangeProviderType as ExchangeProviderTypeDomain import com.tangem.feature.swap.domain.models.domain.SwapPairLeast as SwapPairDomain import com.tangem.feature.swap.domain.models.domain.SwapProvider as SwapPairProviderDomain -class SwapPairInfoConverter : Converter> { +class SwapPairInfoConverter : Converter { private val rateTypeConverter = RateTypeConverter() - override fun convert(value: SwapPairsWithProviders): List { + override fun convert(value: SwapPairsWithProviders): PairsWithProviders { val providersAdditionalMap = value.providers.associateBy { it.id } - return value.swapPair.map { pair -> + val pairs = value.swapPair.map { pair -> SwapPairDomain( from = LeastTokenInfo( contractAddress = pair.from.contractAddress, @@ -28,6 +30,20 @@ class SwapPairInfoConverter : Converter, - ): List { + ): PairsWithProviders { return repository.getPairs(initialCurrency, currenciesList) } diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt index 9f90d4dc3d..f68c41e255 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapRepository.kt @@ -9,7 +9,7 @@ import java.math.BigDecimal interface SwapRepository { - suspend fun getPairs(initialCurrency: LeastTokenInfo, currencyList: List): List + suspend fun getPairs(initialCurrency: LeastTokenInfo, currencyList: List): PairsWithProviders suspend fun getRates(currencyId: String, tokenIds: List): Map diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/PairsWithProviders.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/PairsWithProviders.kt new file mode 100644 index 0000000000..c642d3f52e --- /dev/null +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/domain/PairsWithProviders.kt @@ -0,0 +1,6 @@ +package com.tangem.feature.swap.domain.models.domain + +data class PairsWithProviders( + val pairs: List, + val allProviders: List, +) \ No newline at end of file diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt index 1d29633fec..60c8e749bd 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/models/ui/TokensDataStateExpress.kt @@ -1,16 +1,19 @@ package com.tangem.feature.swap.domain.models.ui import com.tangem.feature.swap.domain.models.domain.CryptoCurrencySwapInfo +import com.tangem.feature.swap.domain.models.domain.SwapProvider data class TokensDataStateExpress( val fromGroup: CurrenciesGroup, val toGroup: CurrenciesGroup, + val allProviders: List, ) { companion object { val EMPTY = TokensDataStateExpress( fromGroup = CurrenciesGroup(emptyList(), emptyList()), toGroup = CurrenciesGroup(emptyList(), emptyList()), + allProviders = emptyList(), ) } } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index b2ba4e8a24..101200169e 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -791,7 +791,7 @@ internal class SwapViewModel @Inject constructor( val fromToken = dataState.fromCryptoCurrency ?: return@UiActions val amountToSwap = dataState.amount ?: return@UiActions val selectedProvider = dataState.selectedProvider ?: return@UiActions - uiState = stateBuilder.updateSelectedFeeBottomSheet(uiState, it.feeType) + uiState = stateBuilder.dismissBottomSheet(uiState) dataState = dataState.copy(selectedFee = it) viewModelScope.launch(dispatchers.io) { val updatedState = swapInteractor.updateQuotesStateWithSelectedFee( @@ -823,7 +823,7 @@ internal class SwapViewModel @Inject constructor( val fromToken = dataState.fromCryptoCurrency if (provider != null && swapState != null && fromToken != null) { analyticsEventHandler.send(SwapEvents.ProviderChosen(provider)) - uiState = stateBuilder.updateSelectedProvider(uiState, provider.providerId) + uiState = stateBuilder.dismissBottomSheet(uiState) setupLoadedState( provider = provider, state = swapState, @@ -915,15 +915,12 @@ internal class SwapViewModel @Inject constructor( } private fun getAllProviders(): List { - dataState.tokensDataState?.let { data -> - val allProviders = - data.fromGroup.available.flatMap { it.providers } + data.toGroup.available.flatMap { it.providers } - return allProviders.distinct() - } ?: return emptyList() + return dataState.tokensDataState?.allProviders ?: emptyList() } private fun getUnavailableProvidersFor(state: Map): List { - return getAllProviders().filterNot { it in state } + val availableProviders = state.keys.map { it.providerId } + return getAllProviders().filterNot { availableProviders.contains(it.providerId) } } private fun Map.getLastLoadedSuccessStates(): SuccessLoadedSwapData {